一、数据分组

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()