文章目录
- 变量类型的转换
- Pandas 支持的数据类型
- 在不同数据类型间转换
- 建立索引
- 新建数据框时建立索引
- 读入数据时建立索引
- 指定某列为索引列
- 将索引还原变量列
- 引用和修改索引
- 引用索引
- 修改索引
- 修改索引名
- 修改索引值
- 更新索引
- Series的索引和切片
- DataFrame的索引和切片
- 选择列
- 按行列索引选择
- isin()选择
- query()的使用
- 排序
- 用索引排序
- 使用变量值排序
- 计算新变量
- 新变量为常数
- 基于原变量做简单四则运算
- 基于一个原变量做函数运算
- 在指定位置插入新变量列
变量类型的转换
Pandas 支持的数据类型
具体类型是 Python, Numpy 各种类型的混合,可以下分的更细:
- float
- int
- string
- bool
- datetime64[nsr] datetime64[nsr,tz] timedelta[ns]
- category
- object
df.dtypes :査看各列的数据类型
df.dtypes
在不同数据类型间转换
df.astype(dtype :指定希望转换的数据类型,可以使用 numpy 或者 python 中的数据类型: int/float/bool/strcopy = True :是否生成新的副本,而不是替换原数据框errors = 'raise' : 转换出错时是否抛出错误,raise/ ignore )
#将df里所有的列转换成str
df.astype('str')
df.astype('str').dtypes
#修改某一列数据的数据类型
df.column.astype ('str')
#转换错误
df.astype('int', errors = 'ignore').dtypes
明确指定转换类型的函数:
- 旧版本方法:
- pd.to_datetime ()
- pd.to_timedelta ()
- pd.to_numeric ()
- df.to_string()
可以通过 df. apply 来批量逬行多列的转换
pd. to_numeric (df .cloumn)
#转换单列
pd.to_numeric(df.软件)
#选择多列进行转换
df [['cloumn1','cloumn2']].astype('str').apply(pd. to_numeric).dtypes
建立索引
新建数据框时建立索引
所有的数据框默认都已经使用从 0 开始的自然数索引,因此这里的"建立”索引指的是自定义索引
df = pd.DataFrame( {'varl' : 1.0, ' var2' :[1,2,3,4], 'var3' : ['test', 'python','test','hello'] , 'var4' : 'cons'} , index =[0,1,2,3])
'''varl var2 var3 var4
0 1.0 1 test cons
1 1.0 2 python cons
2 1.0 3 test cons
3 1.0 4 hello cons
'''
读入数据时建立索引
使用现有列
df = pd.read_csv ("filename",index_col="column”)
使用复合列
df = pd.read_csv ("filename", index_col=[0,1..])
指定某列为索引列
df.set_index(keys :被指定为索引的列名,复合索引用 list:格式提供drop = True :建立索引后是否删除该列append = False :是否在原索引基础上添加索引,默认是直接替换原索引 inplace = False :是否直接修改原数据框 )
# 示例
df_new = df.set_index (keys=['学号','性别'],drop = False)
df_new = df.set_index (keys='学号',append=True, drop=False)
将索引还原变量列
df.reset_index(
drop = False :是否将原索引直接删除,而不是还原为变量列
inplace = False :是否直接修改原数据框
)
df.set_index (['col1','col2','col3'])
将索引全部还原为变量
df.reset_index ()
是否删除 index 列
df.reset_index (drop=True)
引用和修改索引
引用索引
- 注意:索引仍然是有存储格式的,注意区分数值型和字符型的引用方式
df.index
修改索引
修改索引名
本质上和变量列名的修改方式相同
df = pd.DataFrame({'name':['zs','ls','ww'],'level':['vip1','vip2','pm']})
'''name level
0 zs vip1
1 ls vip2
2 ww pm
'''
df.index.name='sno'
'''
sno name level
0 zs vip1
1 ls vip2
2 ww pm
'''
示例用法
df2 = pd.read_excel('stu_data.xlsx')
df3 = df2.set_index(keys = '学号')
df4 = pd.read_excel('stu_data.xlsx')
df5 = df2.set_index(keys = ['学号','性别'])
df5.index.names = ['no','sex']
df5.index.names=[None,None]
修改索引值
df.index = ['a', 'b', 'c']
更新索引
reindex 则可以使用数据框中不存在的数值建立索引,并据此扩充
新索引值对应的索引行/
列,同时进行缺失值填充操作。
df.reindex(
**labels 😗*类数组结构的数值,将按此数值重建索引,非必需
**copy = True 😗*建立新对象而不是直接更改原 df/series 缺失数据的处理方式
**method 😗*针对已经排序过的索引,确定数据单元格无数据时的填充方法,非必需
**pad / ffill:**用前面的有效数值填充
**backfill / bfill:**用后面的有效数值填充
**nearest:**使用最接近的数值逬行填充
**fill_value = np.NaN 😗*将缺失值用什么数值替代
**limit = None 😗*向前/向后填充时的最大步长
)
df = pd.DataFrame({'name':['zs','ls','ww'],'level':['vip1','vip2','pm']})
'''name level
0 zs vip1
1 ls vip2
2 ww pm
'''
df.reindex([0,1,3])
'''
name level
0 zs vip1
1 ls vip2
3 ww pm
'''
df.reindex([0,1,2,3],method='ffill')
'''name level
0 zs vip1
1 ls vip2
2 ww pm
3 ww pm
'''
df.reindex([0,1,2,3],fill_value="test")
'''name level
0 zs vip1
1 ls vip2
2 ww pm
3 test test
'''
Series的索引和切片
【示例】索引
data=pd.Series([4,3,25,2,3],index=list('abcde'))
'''
a 4
b 3
c 25
d 2
e 3
dtype: int64
'''
data['a'] #根据key获取
# np.int64(4)
data[1] #索引获取
# np.int64(3)
data[-1]
np.int64(3)
【示例】切片
data=pd.Series([4,3,25,2,3],index=list('abcde'))
'''
a 4
b 3
c 25
d 2
e 3
dtype: int64
'''
data['a':'d']
'''
a 4
b 3
c 25
d 2
dtype: int64
'''
data[2:4] #索引切片
'''
c 25
d 2
dtype: int64
'''
data[-3:-1]
'''
c 25
d 2
dtype: int64
'''
data[data>3]
'''
a 4
c 25
dtype: int64
'''
如果索引与行名相同都是1,这时候就不知道是按照哪个来获取,所以获取时候使用loc、iloc
- loc函数:通过行索引 “Index” 中的具体值来取行数据及根据普通索引获取。(如取"Index"为"A"的行)
- iloc函数:通过行号来取行数据,及根据位置索引获取。
【示例】loc与iloc的使用
data=pd.Series([5,3,2,5,9],index=[1,2,3,4,5])
'''
1 5
2 3
3 2
4 5
5 9
dtype: int64
'''
data.loc[1]
# np.int64(5)
data.iloc[1] # 第二行的数据
# np.int64(3)
DataFrame的索引和切片
选择列
当想要获取 df 中某列数据时,只需要在 df 后面的方括号中指明要选择的列即可。如果是一列,则只需要传入一个列名;如果是同时选择多列,则传入多个列名即可(注意:多个列名 用一个 list 存放)
#获取一列
df[col]
#获取多列
df[[col1 , col2]]
除了传入具体的列名,我们可以传入具体列的位置,即第几行,对数据进行选取,通过传入位置来获取数据时需要用到 iloc 方法。
df.iloc[,[0,2]]
按行列索引选择
DataFrame对象按照行列检索获取,可以使用loc和iloc函数,方括号中逗号之前的部分表示要获取的行的索引,如果输入一个冒号,或不输入任何数值表示获取所有的行或列,逗号之后方括号表示要获取的列的索引。
df.loc[普通行索引,普通列索引]
df.iloc[位置行索引,位置列索引]
【示例】loc与iloc获取
data=pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('ABCD'))
#获取行为'b'的行
data.loc['b']
#使用iloc获取,行为'b'的行,行号为1
data.iloc[1]
# 获取'A'列所有行
data.loc[:,'A']
data.iloc[:,0]
# 获取部分行部分列
#获取a bc行,A B列
data.loc[['a','b','c'],['A','B']]
data.iloc[[0,1,2],[0,1]]
# 【示例】获取满足条件的行
df[df[“支出”]>10]
df[(df[“支出”]>10) & (df[“性别”]=='女')]
isin()选择
df.isin(values) 返回结果为相应的位置是否匹配给出的 values
- values 为序列:对应每个具体值
- values 为字典:对应各个变量名称
- values 为数据框:同时对应数值和变量名称
样例:
df.col.isin([1,3,5])
df[ df.col.isin([1,3,5])]
df[ df.col.isin(['val1','val2'])]
df[ df.index.isin(['val1','val2'])]
query()的使用
使用boolean值表达式进行筛选
df.query(
expr:语句表达式
inplace=False;是否直接替换原数据框
)
可以使用前缀“@”引用环境变量
等号为==,而不是=
样例:
df.query("col>10 and col<90 and col1=val")
limit = 5
df.query("col<=@limit & col==val")
df.query("col<=@limit & col!=val")
排序
用索引排序
df.sort_index(
level :(多重索引时)指定用于排序的级别顺序号/名称18
ascending = True :是否为升序排列,多列时以表形式提供
inplace = False :是否保留原有排序
na_position = 'last‘ :缺失值的排列顺序,first/last
)
样例:
df = pd.read_excel("stu_data.xlsx",index_col=["学号”,”性别”]) df.set_index( ['学号','性别'], inplace = True )
# 通过索引进行排序
df.sort_index()
df.sort_index(ascending=False)
df.sort_index(ascending = [True,False])
#设置哪个索引进行排序
df.sort_index(level="支出")
df.sort_index(level= ["支出","体重"])
使用变量值排序
df.sort_values(
by :指定用于排序的变量名,多列时以列表形式提供
ascending = True :是否为升序排列
inplace = False :是否保留原有排序
na_position = 'last‘ :缺失值的排列顺序,first/last
)
样例:
# 根据值进行排序
df.sort_values(by='身高')
计算新变量
新变量为常数
df[‘vamame’] = value
df.newvar = 1 #注意该命令不会报错!但并没有添加新变量
df.head()
df['col'] =1
基于原变量做简单四则运算
df[‘var’] = df[‘oldvar’] *100
df[‘var’] = df.oldvar * 100
样例:
df ['new_val'] = df .总分 + df .名次 + 1
# 使用内部函数计算
import math
df['n3'] = math.sqrt(9)
df['n4'] = math.sqrt(df.体重) #报错
import numpy
df['n4'] = numpy.sqrt(df.体重)
基于一个原变量做函数运算
df.apply(
func : 希望对行/列执行的函数表达式
axis = 0 :针对行还是列逬行计算
0 ’ index’:针对每列进行计算
1’ columns ':针对每行进行计算
)
简化的用法
df [’ varname ’ ] = df. oldvar. apply (函数表达式)
df['n5'] = df.体重.apply(math.sqrt)
df['n7'] = df.体重.apply(numpy.sqrt)
# 使用自定义函数
def get_first(tmp):return tmp[:1]
df['n6'] = df.开设.apply(get_first)
不修改原df,而是生成新的df
df.assign(varname = expression)
# 返回新的dataframe
df2 = df.assign(n8 = df.课程.apply(get_first)
在指定位置插入新变量列
df.insert(
loc :插入位置的索引值,0 <= loc <= len (columns)
column :插入的新列名称
value : Series 或者类数组结构的变量值
allow_duplicates = False :是否允许新列重名
)
该方法会直接修改原df
# 指定位置增加新列
df.insert(1,'new_col',100)
df.insert(1,'new_col2',df.课程.apply(get_first))