pandas 常规操作,你学 ’废‘ 了么?
2021-01-06 17:51:12
浏览数 (2458)
一 聚合函数
1. numpy、pandas使用的统计方式
在数组中经常使用的聚合方式
data[['counts', 'ches_name']].agg([np.mean, np.std])
agg({'xx':np.mean, 'xx2':[np.sum, np.std]})
2. 在pandas或者numpy中没有现成的函数可以使用,可以使用transform自定义函数
如: 将指定列的全部数据 * 2
方式一
data['counts'].transform(lambda x: x*2)
方式二:按照函数内既定的规则,进行指定数据的操作
def transform_func(values):
"""自定义函数,定义数据操作规则"""
return values*2
data['counts'].transform(transform_func) # 一维
data1 = data.groupby(by='品牌')['销售额'].transform(tran_func) # 分组之后自定义聚合
推荐好课:Python 自动化办公
二 透视表 - pivot_table
源码参数分析
def pivot_table(
data, # Dataframe,对哪张表进行操作
values=None, # 显示的字段
index=None, # 行分组键,可以是数组,列表,如果是数组,必须有一样的长度
columns=None, # 列分组键
aggfunc="mean", # 聚合函数, 默认是mean
fill_value=None, # 填充空值, 将为Nan的值填充为对应的值
margins=False, # 汇总开关,默认是False
dropna=True,
margins_name="All", # 汇总的列或者行的bolumns,可以指定修改名称
observed=False,
1、index: 行分组键,分完组后,分组键的取值在行索引的位置上
pd.pivot_table(data, index=['order_id', 'dishes_name'], aggfunc=[np.mean, np.sum], values=['add_inprice', 'counts'])
mean sum
add_inprice counts add_inprice counts
order_id dishes_name
137 农夫山泉NFC果汁100% 0 1 0 1
凉拌菠菜 0 1 0 1
番茄炖牛腩\r\n 0 1 0 1
白饭/小碗 0 4 0 4
西瓜胡萝卜沙拉 0 1 0 1
... ... ... ... ...
1323 番茄炖秋葵 0 1 0 1
芝士烩波士顿龙虾 0 1 0 1
芹黄鳝丝 0 1 0 1
蒜蓉生蚝 0 1 0 1
谷稻小庄 0 1 0 1
[2778 rows x 4 columns]
2、columns: 列分组键,分完组后,分组键的取值在列索引上
pd.pivot_table(data, columns= ['order_id', 'amounts'], aggfunc=[np.mean, np.sum], values=['add_inprice', 'counts'])
# 列分组键,可以说是行分组键的转置
mean ... sum
order_id 137 165 ... 1323
amounts 1 6 26 27 35 99 9 ... 39 49 58 65 78 80 175
add_inprice 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0 0 0 0 0 0 0
counts 4.0 1.0 1.0 1.0 1.0 1.0 1.5 ... 1 1 1 1 1 1 1
[2 rows x 4956 columns]
3、结合使用
# aggfunc 聚合函数
# fill_value 为空的,怎么显示,默认为Nan
# margins 汇总,默认是不汇总
# margins_name 汇总列或者行字段名称,默认为all
pd.pivot_table(data, index=['dishes_name'], columns='order_id', values='counts', aggfunc=np.sum, fill_value=0, margins=True, margins_name='总')
dishes_name 42度海之蓝 北冰洋汽水 38度剑南春 50度古井贡酒 ... 黄油曲奇饼干 黄花菜炒木耳 黑米恋上葡萄 总
order_id ...
137 0 0 0 0 ... 0 0 0 9
165 0 0 1 0 ... 0 1 0 21
166 0 0 0 0 ... 0 0 0 7
171 0 0 0 0 ... 0 0 0 10
177 0 0 0 0 ... 0 0 0 4
... ... ... ... ... ... ... ... ... ...
1314 0 0 1 0 ... 0 0 0 12
1317 0 0 0 0 ... 0 0 0 18
1319 0 0 0 0 ... 0 0 0 9
1323 0 0 1 0 ... 0 0 0 15
总 5 45 6 5 ... 5 15 18 3088
推荐好课:Python 自动化管理
三 交叉表-crosstab
def crosstab(
index, # 行分组键
columns, # 列分组键
values=None, # 显示的字段
rownames=None, # 行name
colnames=None, # 列name
aggfunc=None, # 聚合函数
margins=False, # 汇总
margins_name: str = "All", # 汇总列或者行的名称
dropna: bool = True,
normalize=False,
基本语法
pd.crosstab(index = data['dishes_name'], columns=data['order_id'], values=data['counts'], aggfunc = np.sum)
dishes_name 42度海之蓝 北冰洋汽水 38度剑南春 ... 黄油曲奇饼干 黄花菜炒木耳 黑米恋上葡萄
order_id ...
137 NaN NaN NaN ... NaN NaN NaN
165 NaN NaN 1.0 ... NaN 1.0 NaN
166 NaN NaN NaN ... NaN NaN NaN
171 NaN NaN NaN ... NaN NaN NaN
177 NaN NaN NaN ... NaN NaN NaN
... ... ... ... ... ... ... ...
1309 NaN NaN NaN ... NaN NaN NaN
1314 NaN NaN 1.0 ... NaN NaN NaN
1317 NaN NaN NaN ... NaN NaN NaN
1319 NaN NaN NaN ... NaN NaN NaN
1323 NaN NaN 1.0 ... NaN NaN NaN
[278 rows x 156 columns]
四 表格合并
1、每个表的列都相同,pd.concat((df1, df2, df3 … ))
axis = 0 : 纵向合并axis = 1:横向合并,索引对应合并
函数源码
def concat(
objs: Union[Iterable["NDFrame"], Mapping[Label, "NDFrame"]], # 传入的是Df格式
axis=0, # 进行合并的方向
join="outer", # 默认使用的外连接
ignore_index: bool = False, # 重置排序索引
keys=None,
levels=None,
names=None,
verify_integrity: bool = False,
sort: bool = False,
copy: bool = True,
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K3'], 'key2': ['K0', 'K1', 'K0', 'K1'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
pd.concat((left, right), axis = 0, join = 'inner') # 指定使用内连接,进行合并,默认使用的是outer
pd.concat((left, right), axis = 1, join = 'inner')
2、 表合并,解决行索引没有意义情况下,数据行不匹配问题(解决concat横向拼接问题)
def merge(
left, # 左表
right, # 右表
how: str = "inner", # 默认是内连接,
on=None, # 必须是两张表中有公共的主键,才能作为主键
left_on=None, # 左表主键
right_on=None, # 右表主键
left_index: bool = False,
right_index: bool = False,
sort: bool = False,
suffixes=("_x", "_y"),
copy: bool = True,
indicator: bool = False,
validate=None,
(1) 两表中有相同的主键
on 连接的主键,两表中共有的主键
how 连接的方式,默认使用的是内连接
outer外连接,返回全部 inner内连接返回等值连接 left以左表为主 right以右表为主
pd.merge(left, right, on='key1', how='outer')
key1 key2_x A B key2_y C D
0 K0 K0 A0 B0 K0 C0 D0
1 K0 K1 A1 B1 K0 C0 D0
2 K1 K0 A2 B2 K0 C1 D1
3 K1 K0 A2 B2 K0 C2 D2
4 K3 K1 A3 B3 NaN NaN NaN
5 K2 NaN NaN NaN K0 C3 D3
多个相同主键连接
pd.merge(left, right, on=['key1', 'key2'], how='outer')
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K0 K1 A1 B1 NaN NaN
2 K1 K0 A2 B2 C1 D1
3 K1 K0 A2 B2 C2 D2
4 K3 K1 A3 B3 NaN NaN
5 K2 K0 NaN NaN C3 D3
(2) 两表中没有相同的主键
left_on : 指定左表中的主键
right_on : 指定右表中的主键
pd.merge(left, right, left_on = 'key1', right_on = 'key2', how='outer')
key1_x key2_x A B key1_y key2_y C D
0 K0 K0 A0 B0 K0 K0 C0 D0
1 K0 K0 A0 B0 K1 K0 C1 D1
2 K0 K0 A0 B0 K1 K0 C2 D2
3 K0 K0 A0 B0 K2 K0 C3 D3
4 K0 K1 A1 B1 K0 K0 C0 D0
5 K0 K1 A1 B1 K1 K0 C1 D1
6 K0 K1 A1 B1 K1 K0 C2 D2
7 K0 K1 A1 B1 K2 K0 C3 D3
8 K1 K0 A2 B2 NaN NaN NaN NaN
9 K3 K1 A3 B3 NaN NaN NaN NaN
(3) 更改表格名称的方法
left.rename(columns={'key1': 'key11111'}, inplace=True)
print(left)
key11111 key2 A B
(4) 重叠合并,目的是将残缺的表,合并为完整的表df1.combine_first(df2)
主表.combine_first(附表) dict1 = {'ID':[1,2,3,4,5,6,7,8,9], 'System':['W10','w10',np.nan,'w10',np.nan,np.nan,'w7','w7','w8']}
dict2 = {'ID':[1,2,3,4,5,6,7,8,9],
'System':[np.nan,np.nan,'w7','w7','w7','w7','w8',np.nan,np.nan]}
df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
print(df1,df2) # 谁在前,为主表,主表中没有的补全,有的值,不动
print(df1.combine_first(df2))
ID System 0 1 W10 1 2 w10 2 3 w7 3 4 w10 4 5 w7 5 6 w7 6 7 w7 7 8 w7 8 9 w8
推荐好课:Python3进阶:数据分析及可视化