for
循环遍历所有元素at
与loc
align
at
与iat
,loc
与iloc
pd.isna()
category
数据类型存在的意义coalesce
CategoricalDtype
to_frame(name=name)
as_type
rename
reindx
reindex_like
drop
drop_duplicates
merge
join
concat
any
all
transform
applymap
agg
apply
pipe
applymap
与apply
agg
与apply
apply
,applymap
,agg
,transform
,pipe
query
assign
eval
explode
for
循环遍历所有元素1 for i in df.index:
2 for j in df.column:
at
与loc
at只能作用于一个值的修改,loc可以修改多值。如果只要访问单个元素,at比loc速度更快,应该优先选择at而不是loc。
align
作用是将2个dataframe根据列或者行索引进行对齐,保证列或者行的索引数是一致的
at
与iat
,loc
与iloc
已i开头使用整数索引,第一行,第一列就是[0,0]。不以i开头的通过索引值和列标签来获取值。
pd.isna()
用于检测空值最佳的选择,它会根据输入返回bool值来确定是否为空。
category
数据类型存在的意义coalesce
合并多列的值为一列,可以就地修改在首列,也可以重命名新列,合并逻辑(第一列为空的用后面的列填补)
CategoricalDtype
可以将分类变量数据转为categoriceldtype类型,可以设置该列的内部顺序,可以重新自定义顺序.
to_frame(name=name)
可以将series转换为一个数据框,然后通过name设置列名
as_type
将数据类型进行转换
xxxxxxxxxx
11df.column_name = df.column_name.astype("type")
rename
改变列或行的名称
xxxxxxxxxx
11df.rename(columns/index=)
reindx
修改列或者索引顺序
x1# 让df的column顺序设置为cols的顺序
2cols = ["A","B","C"]
3df = df.reindex(columns=cols)
4
5# 让df的index设置为cols的顺序
6df=df.reindex(index = cols)
reindex_like
从指定的dataframe的索引结构重建索引
xxxxxxxxxx
21# 生成一个只有空值的df,它的索引结构与df1的索引结构一致
2df = pd.Dataframe().reindex_like(df1)
drop
删除行或者列
xxxxxxxxxx
11df.drop(columns/index=)
drop_duplicates
根据特定列删除重复值,默认是根据所有列删除重复值。
xxxxxxxxxx
81# 基于所有列删除重复行
2df.drop_duplicates()
3# 基于指定列删除重复行
4df.drop_duplicates(subset=["column_name_1","column_name_2"])
5# 设置具体保留重复的是首次重复还是最后重复
6df.drop_duplicates(keep="first|last")
7# 不保留重复值
8df.drop_duplicates(keep=False)
merge
多表连接的方法,可以内连接、外连接。可以根据列名连接,也可以根据索引连接。
join
多表连接的方法,只根据索引进行连接。
concat
多表拼接,横向或者纵向拼接,可以指定是内连接还是外连接。
any
根据一列或者一行布尔值返回一个布尔值结果,如果该值的列表里面只要存在一个True
,结果就是True
,反之返回False
all
根据一列或者一行布尔值返回一个布尔值结果,如果该值的列表里面只要存在一个False
,结果就是False
,反之返回True
transform
沿着特定轴的特定索引对df做函数映射变换,通常使用是对df的特定列做函数映射变换,返回相同形状映射后的结果列。
applymap
对整个dataframe所有的元素做函数映射操作,返回映射后相同形状,相同行和列索引的dataframe。
agg
沿着行或者列对dataframe做聚合函数操作,将特定行或者特定列向量聚合到标量结果,比如对一列计算平均值,对一列计数。
apply
pipe
当你需要对一个dataframe做某种逻辑处理(即自定义函数),并且需要返回一个dataframe。你可以使用pipe函数传递你自己的自定义函数,func(df) => df.pipe(func)
如果你的自定义的函数的第一个参数不是dataframe,而是其他位置才传入dataframe,则可以这样 pipe((func_name,'形参名称'))
。即func(a,df) =>df.pipe((func,'df'),a)
如果你的自定义函数还有其他参数(除了df以为),可以这样传入自定义函数的参数.
df.pipe(func,param_01=value)`
applymap
与apply
applymap操作dataframe每一个元素,apply操作dataframe一列,df.apply(意思是对df的所有列做相同的操作,如果这个自定义函数只能对一些列可以用,对其他某些列不能用就可能会报错,比如一些计算只能对数值变量使用,对文本变量就会报错)
agg
与apply
agg是将指定的向量聚合为标量,比如求向量的平均数,比如将向量元素用字符串拼接为一个字符串,agg传入的就是单独分割开的列。 apply不仅可以将向量聚合为标量,也可以是返回整个dataframe,也可以是返回指定的向量,根据需求来,apply传入的一般是dataframe或者series。 如果agg可以完成需要就使用agg,agg不能完成才考虑apply,因为agg比apply运行速度更快。
apply
,applymap
,agg
,transform
,pipe
这四个函数逻辑上非常相似,都是与函数配合完成对df的复杂操作。
query
数据筛选的一种便捷方法,同时查询速度比正常用loc还要快
xxxxxxxxxx
61#意思是该列有这个数组里面的值将被筛选到
2df.query("column_name == []")
3
4#通过@符号引用变量
5brand = "可口可乐"
6df.query("brand==@brand")
assign
给dataframe增加新列的一种方法,通过传递关键字参数来构造新列,关键字参数的关键字就是新列的名称,关键字参数的值就是构造列具体值的方式,类似于excel的辅助列。
xxxxxxxxxx
21# 给df增加名为is_target_sku的列,列的结果是根据sku列是否包含某个模式,如果包含这个模式返回1,否则返回0.
2df.assign(is_target_sku = df.sku.str.contains(pattern).transform(lambda x: 1 if x else 0))
eval
创建列的一种高级便捷优雅的方式。
xxxxxxxxxx
91# 创建A列等于B列+C列的值
2df.eval("A=B+C")
3# 通过存在的列进行计算,增加不败率和场均失球列
4df.eval(
5 '''
6 不败率=(胜+平)/场次
7 场均失球=失球/场次
8 '''
9 )
explode
将特定列的类似列表的每个元素展开为一行,同时复制其他列的值,保留原始索引。
输入数据如下:
姓名 | 球队 | 国籍 | |
---|---|---|---|
0 | 莱奥内尔·梅西 | 巴塞罗那 | ['阿根廷', '西班牙'] |
1 | 克里斯蒂亚诺·罗纳尔多 | ['曼联', '皇家马德里'] | 葡萄牙 |
xxxxxxxxxx
11df.explode("球队").explode("国籍")
输出结果:
姓名 | 球队 | 国籍 | |
---|---|---|---|
0 | 莱奥内尔·梅西 | 巴塞罗那 | 阿根廷 |
0 | 莱奥内尔·梅西 | 巴塞罗那 | 西班牙 |
1 | 克里斯蒂亚诺·罗纳尔多 | 曼联 | 葡萄牙 |
1 | 克里斯蒂亚诺·罗纳尔多 | 皇家马德里 | 葡萄牙 |
重复索引标签的形式:
xxxxxxxxxx
31# 这里设置表格索引不采用稀疏的方式,就是表格的形式.
2with pd.option_context('display.multi_sparse', False):
3 df
稀疏的形式:
xxxxxxxxxx
31# 这里设置表格索引采用稀疏的方式,类似于树形结构,导出到excel前面的索引会变成合并单元格.
2with pd.option_context('display.multi_sparse', True):
3 df
astpe
方法传入str
参数,不会将None转换为'nan',但是仍然会将np.nan转换为'nan'astype
传入string
参数,则所有空值会被转换为pd.NA
xxxxxxxxxx
11df.drop("指定需要拆分堆叠的列",axis = 1).join(df["指定需要拆分堆叠的列"].str.split("指定拆分符",expand = True).stack().reset_index(level = 1,drop = True).rename("指定需要拆分堆叠的列"))
直接对dataframe的列重新赋值就可以了。
xxxxxxxxxx
31midx = pd.MultiIndex(levels=[['zero', 'one'], ['x','y']], labels=[[1,1,0,],[1,0,1,]])
2df = pd.DataFrame(np.random.randn(2,3), columns=midx)
3df.columns = ['A','B','C']
xxxxxxxxxx
21# 可以使用skiprows来忽略一些行,第一行就是0号,下面代码意思是忽略第一行和第三行。
2df=pd.read_excel(file,skiprows=[0,2])
只能通过使用at方法,当你使用loc方法它会以为你要给多列赋值,赋的值就是列表的元素,而且必须把类型转换为object类型,否则依然会报错(setting an array element with a sequence)
xxxxxxxxxx
21a = [1,2,3]
2df.at[index,columns] = a
使用np.where(条件,条件真返回,条件否返回)
xxxxxxxxxx
11df_score["陈列平均分"]=np.where(df_score.门店类型=="无促",df_score.陈列基础*0.4, df_score.陈列基础)
read_excel
与read_csv
理论上这2个读取表格的方法,通过设置参数可以读取单表中任何指定区域的数据,还可以设置哪些字符被识别为NA,表头和索引的位置.