一、数据分组
1.1 groupby分组
分组键是多形式的,可以是列名:
df.groupby("客户分类")
# 也可按多列分组进行运算
df.groupby(["客户分类","区域"]).sum()
也可以是Series
将DataFrame的其中一列取出即为一个Series,比如df[“客户分类”]
df.groupby(df["客户分类"])
# 也可按多列分组进行运算
df.groupby([df["客户分类"],df["区域"]]).sum()
当有多个数据集时,还可用如下语法糖:
df.groupby(['key1','key2'])[['data2']].mean()
分组键还可以是与需要分组的轴向长度一致的值列表或值数组
还可以是能在轴索引或索引中的单个标签上调用的函数
比如可以根据名字的长度进行分组
people.groupby{len).sum()
1.2 神奇的aggregate
aggregate可以一次性汇总使用多种聚合函数
# 对分组后的所有列做计数汇总运算
df.groupby("客户分类").aggregate(["count","sum"])
# 还可针对不同列做不同运算
df.groupby("客户分类").aggregate({"ID":"count","销量":"sum"})
最后, 对分组后结果重置索引
DataFrameGroupBy对象经过汇总运算后的形式不是标准的DataFrame形式,转化方式:
df.groupby("ID").sum().reset_index()
二、数据透视表
pivot_table参数:
pd.pivot_table(data,values=None,columns=None,index=None,aggfunc='mean',
fill_value=None,margins=False,dropna=True,margins_name='All')
#index 对应Excel中的行那个框
#columns对应列
#aggfunc表示对values的计算类型,可以传入多个
aggfunc={"ID":"count","sales":"sum"}
#fill对空值的填充,默认NaN
#margins是否显示合计列(行|列的总计值)
#dropna是否删除缺失,若为真,将一整行作为缺失值删除
#margins_name表示合计列的列名
将客户分类作为index,区域作为columns,用户ID作为values,对values执行count运算
pd.pivot_table(df,values="ID",columns="Area",index="客户分类",aggfunc='count')
通常对结果也会进行重置索引操作
三、多表拼接
3.1 横向连接
一对一
两个表的公共列是一对一的
pd.merge(df1,df2)
多对一
其中一个的公共列有重复,另一个是唯一的
pd.merge(df1,df2,on="ID")
结果是保留df2的重复值,并相应的增加df1的重复值
多对多
pd.merge(df1,df2)
默认寻找两个表中的公共列,可多列,用列表
当没有公共列(指列名不一致但内容一致),可分别指定左右连接键
pd.merge(df1,df2,left_on="ID",right_on="Number")
索引作为连接键
pd.merge(df1,df2,left_index=True,right_index=True)
#也可混用
pd.merge(df1,df2,left_index=True,right_on="Number")
3.2连接方式
内连接
默认连接方式
pd.merge(df1,df2,on="ID", how="inner")
左连接
以 左表为基础,右表若无用Nan填充
外连接
取两个表的并集,how=“outer”
3.3 重复列名的处理
可以用参数suffixes定义重复的列名,默认为["_x","_y"]
pd.merge(df1,df2,on="ID", how="inner",suffixes=["_L","_R"])
3.4 纵向连接
普通合并
pd.concat(df1,df2) #默认保留原有索引
#生成新索引
pd.concat([df1,df2],ignore_index=True)
#numpy中则用
np.concatenate([arr,arr],zxis=1)
重叠数据合并
删除重复值
pd.concat([df1,df2],ignore_index=True).drop_duplicates()