Pandas 高级数据处理
一、级联
pd.concat(objs, axis=1, verify_integrity=False, keys, ignore_index=False, sort=False, join=‘outer’)
-
级联语法的核心就是索引对齐
-
级联的应用场景:不同期,但是结构相同的数据汇总
-
objs:列表/元组
-
axis = 0 列索引对齐, axis=1 行索引对齐
df1 = pd.DataFrame(data=[[1,2,3]], columns=list('ABC'))
df2 = pd.DataFrame(data=[[2,3,4]], columns=list('ABC'))
res2 = pd.concat([df1, df2], axis=1)
print(res2)
>>输出结果:
A B C A B C
0 1 2 3 2 3 4
# 校验级联之后是否有重复索引
pd.concat((df1, df2), axis=1, verify_integrity=True)
# 通过多层级索引来处理重复索引的问题
pd.concat((df1, df2), axis=1, keys=['上半年','下半年'],names=['周期','产品'])
>>输出结果:
周期 上半年 下半年
产品 A B C A B C
0 1 2 3 2 3 4
# 通过忽略索引的方式来处理重复索引的问题
pd.concat((df1, df2), ignore_index=True)
>>输出结果:
A B C
0 1 2 3
1 2 3 4
df3 = pd.DataFrame(data=[[1,2,3,4]], columns=list('CDAB'))
pd.concat((df3, df2))
>>输出结果:
A B C D
0 3 4 1 2.0
0 2 3 4 NaN
# outer:保留级联方向的所有标签(并集),innert:保留级联方向的共有标签(交集)
df4 = pd.DataFrame(data=np.random.randint(0, 100, size=(3,4)), columns=list('ABCD'))
print(df4)
>>输出结果:
A B C D
0 82 20 46 14
1 51 14 31 47
2 23 18 47 38
df5 = pd.DataFrame(data=np.random.randint(-100, 0, size=(4,3)), columns=list('BDE'))
print(df5)
>>输出结果:
B D E
0 -18 -1 -5
1 -32 -19 -73
2 -63 -20 -73
3 -15 -45 -61
pd.concat((df4, df5, df1), sort=True, join='outer')
>>输出结果:
A B C D E
0 82.0 20 46.0 14.0 NaN
1 51.0 14 31.0 47.0 NaN
2 23.0 18 47.0 38.0 NaN
0 NaN -18 NaN -1.0 -5.0
1 NaN -32 NaN -19.0 -73.0
2 NaN -63 NaN -20.0 -73.0
3 NaN -15 NaN -45.0 -61.0
0 1.0 2 3.0 NaN NaN
二、合并
-
合并就是根据两张表的公共信息,把两张表的数据汇总的方法。
-
合并以列的内容为参考标准,不存在行合并,都是列合并。
-
合并的列通常是离散型数据。可以是数值型。
-
合并的列之间存在一对一、一对多、多对多关系,否则合并结果为空。
案例
first_half_year = pd.read_excel('合并表格案例.xlsx', sheet_name=0)
first_half_year.head()
>>输出结果:
用户ID 商品ID 订单ID 购买数量
0 lucy 10001 1009 1
1 jack 10002 1002 2
2 lucy 10003 1007 1
3 alex 10004 1010 1
4 mery 10005 1008 1
second_half_year = pd.read_excel('合并表格案例.xlsx', sheet_name=1)
second_half_year.head()
>>输出结果:
用户ID 商品ID 订单ID 购买数量
0 tom 10006 2001 1
1 oldshang 10003 2002 1
2 小陌 10004 2003 1
3 小明 10004 2004 2
4 小红 10001 2005 1
user_table = pd.read_excel('合并表格案例.xlsx', sheet_name=2)
user_table.head()
>>输出结果:
用户ID 地区 VIP等级 手机号
0 lucy 北京 3 13054344433
1 智哥 深圳 3 13046798795
2 mery 北京 2 17877659878
3 jack 上海 4 18635482221
4 alex 北京 1 17601002323
product_table = pd.read_excel('合并表格案例.xlsx', sheet_name=3)
product_table.head()
>>输出结果:
商品ID 商品类别 商品品牌 商品单价
0 10001 笔记本 华为 8000
1 10002 笔记本 小米 7600
2 10003 鼠标 华为 300
3 10004 鼠标 apple 600
4 10005 键盘 apple 1000
return_table = pd.read_excel('合并表格案例.xlsx', sheet_name=4)
return_table.head()
>>输出结果:
订单_id 退货状态
0 1003 退货中
1 1004 退货中
2 1005 退货完成
3 1011 退货完成
4 1014 退货中
- 计算上半年订单总额GMV
# 两张表合并时,默认是根据所有的相同字段名称的列来进行合并
res1 = pd.merge(left=first_half_year, right=product_table)
>>输出结果:
用户ID 商品ID 订单ID 购买数量 商品类别 商品品牌 商品单价
0 lucy 10001 1009 1 笔记本 华为 8000
1 tom 10001 1011 1 笔记本 华为 8000
2 jack 10002 1002 2 笔记本 小米 7600
3 小陌 10002 1013 1 笔记本 小米 7600
4 alex 10002 1001