python学习 --DataFrame连接: merge、concat、join、append
目录1、pd.merge(left, right, how='inner')2、pd.concat([left,right],axis=1,join='inner’)a、根据行索引进行连接(两表所有列横向堆叠)b、根据列索引进行连接(两表所有行纵向堆叠)3、df_left.join(df_right)a、根据行索引进行连接(两表所有列横向堆叠)b、根据列索引进行连接(两表所有列横向堆叠)4、df.
·
目录
1、pd.merge(left, right, how='inner')
2、pd.concat([left,right],axis=1,join='inner’)
1、pd.merge(left, right, how='inner')
- left:指定需要连接的主表
- right:指定需要连接的辅表
- on: 用于连接的列名
- how:指定连接方式,默认为inner内连,还有其他选项,如左连left、右连right和外连outer
根据指定列进行连接:
import pandas as pd
list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
list2 = [['赵一', '游泳'], ['李四', '唱歌'], ['周五', '下棋']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=['a', 'b', 'c'])
df2 = pd.DataFrame(list2, columns=['姓名', '爱好'], index=[1, 2, 3])
# 左连接 --左表全要,右表与之匹配
print(pd.merge(df1, df2, on='姓名', how='left'))
# 右连接 --右表全要,左表与之匹配
print(pd.merge(df1, df2, on='姓名', how='right'))
# 内连接 --只有共有部分匹配
print(pd.merge(df1, df2, on='姓名', how='inner'))
# 外连接 --先将共有部分匹配,再将独有部分缺少数据填充空堆叠
print(pd.merge(df1, df2, on='姓名', how='outer'))
运行结果:
左连接:
姓名 年龄 爱好_x 爱好_y
0 赵一 23 下棋 游泳
1 钱二 27 游泳 NaN
2 孙三 26 唱歌 NaN
右连接:
姓名 年龄 爱好_x 爱好_y
0 赵一 23.0 下棋 游泳
1 李四 NaN NaN 唱歌
2 周五 NaN NaN 下棋
内连接:
姓名 年龄 爱好_x 爱好_y
0 赵一 23 下棋 游泳
外连接:
姓名 年龄 爱好_x 爱好_y
0 赵一 23.0 下棋 游泳
1 钱二 27.0 游泳 NaN
2 孙三 26.0 唱歌 NaN
3 李四 NaN NaN 唱歌
4 周五 NaN NaN 下棋
2、pd.concat([left,right],axis=1,join='inner’)
- left:指定需要连接的主
- right:指定需要连接的辅表
- axis::axis =1用于横向,axis =0代表纵向(默认为0)
- join:指定连接方式,只有outer,inner 两种
- ignore_index:如果为True,不使用并重置轴上的索引值。结果轴将被标记为0,...,n-1。
- keys:序列,默认值无。使用传递的键作为最外层构建层次索引。如果为多索引,应该使用元组。
a、根据行索引进行连接(两表所有列横向堆叠)
import pandas as pd
list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
list2 = [['赵一', '游泳'], ['李四', '唱歌'], ['周五', '下棋']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=[1, 4, 5])
df2 = pd.DataFrame(list2, columns=['姓名', '爱好'], index=[1, 2, 3])
# axis =1用于横向
print(pd.concat([df1, df2], axis=1))
# 内连接 --只有index相同的匹配
print(pd.concat([df1, df2], axis=1, join='inner'))
# 外连接 --先将index相同的匹配, 再将独有部分缺少数据填充空堆叠
print(pd.concat([df1, df2], axis=1, join='outer'))
运行结果:
纵向:
姓名 年龄 性别 姓名 爱好
1 赵一 23.0 男 赵一 游泳
2 NaN NaN NaN 李四 唱歌
3 NaN NaN NaN 周五 下棋
4 钱二 27.0 女 NaN NaN
5 孙三 26.0 女 NaN NaN
纵向内连接:(两表中index相同的行)
姓名 年龄 性别 姓名 爱好
1 赵一 23 男 赵一 游泳
纵向外连接:(两表中i所有行)
姓名 年龄 性别 姓名 爱好
1 赵一 23.0 男 赵一 游泳
2 NaN NaN NaN 李四 唱歌
3 NaN NaN NaN 周五 下棋
4 钱二 27.0 女 NaN NaN
5 孙三 26.0 女 NaN NaN
b、根据列索引进行连接(两表所有行纵向堆叠)
import pandas as pd
list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
list2 = [['赵一', '游泳'], ['李四', '唱歌'], ['周五', '下棋']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=[1, 4, 5])
df2 = pd.DataFrame(list2, columns=['姓名', '爱好'], index=[1, 2, 3])
# axis =0代表纵向
print(pd.concat([df1, df2], axis=0))
# 内连接 --只有column相同的匹配
print(pd.concat([df1, df2], axis=0, join='inner'))
# 外链接 --先将column相同的匹配,再将独有部分缺少数据填充空堆叠
print(pd.concat([df1, df2], axis=0, join='outer'))
运行结果:
纵向:
姓名 年龄 性别 爱好
1 赵一 23.0 男 NaN
4 钱二 27.0 女 NaN
5 孙三 26.0 女 NaN
1 赵一 NaN NaN 游泳
2 李四 NaN NaN 唱歌
3 周五 NaN NaN 下棋
纵向内连接:(两表中共同的列)
姓名
1 赵一
4 钱二
5 孙三
1 赵一
2 李四
3 周五
纵向外连接:(两表中所有的列)
姓名 年龄 性别 爱好
1 赵一 23.0 男 NaN
4 钱二 27.0 女 NaN
5 孙三 26.0 女 NaN
1 赵一 NaN NaN 游泳
2 李四 NaN NaN 唱歌
3 周五 NaN NaN 下棋
注:
i、连接后的表包含df1.index和df2.index,可利用ignore_index = True重新定义新的行索引index
print(pd.concat([df1, df2], axis=0, ignore_index=True))
运行结果:
姓名 年龄 性别 爱好
0 赵一 23.0 男 NaN
1 钱二 27.0 女 NaN
2 孙三 26.0 女 NaN
3 赵一 NaN NaN 游泳
4 李四 NaN NaN 唱歌
5 周五 NaN NaN 下棋
ii、如果先知道如何
- keys:序列,默认值无。使用传递的键作为最外层构建层次索引。如果为多索引,应该使用元组。
print(pd.concat([df1, df2], axis=0, keys=['df1', 'df2']))
运行结果:
姓名 年龄 性别 爱好
df1 1 赵一 23.0 男 NaN
4 钱二 27.0 女 NaN
5 孙三 26.0 女 NaN
df2 1 赵一 NaN NaN 游泳
2 李四 NaN NaN 唱歌
3 周五 NaN NaN 下棋
3、df_left.join(df_right)
a、根据行索引进行连接(两表所有列横向堆叠)
import pandas as pd
list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
list2 = [['1', '游泳'], ['2', '唱歌'], ['5', '下棋']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=[1, 4, 5])
df2 = pd.DataFrame(list2, columns=['工号', '爱好'], index=[1, 2, 5])
# 两表中index相同的匹配,没有相同的列名
print(df1.join(df2))
print(df1.join(df2, how='outer'))
print(df1.join(df2, how='inner'))
运行结果:
姓名 年龄 性别 工号 爱好
1 赵一 23 男 1 游泳
4 钱二 27 女 NaN NaN
5 孙三 26 女 5 下棋
姓名 年龄 性别 工号 爱好
1 赵一 23.0 男 1 游泳
2 NaN NaN NaN 2 唱歌
4 钱二 27.0 女 NaN NaN
5 孙三 26.0 女 5 下棋
姓名 年龄 性别 工号 爱好
1 赵一 23 男 1 游泳
5 孙三 26 女 5 下棋
b、根据列索引进行连接(两表所有列横向堆叠)
import pandas as pd
list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
list2 = [['赵一', '游泳'], ['李四', '唱歌'], ['周五', '下棋']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=[1, 4, 5])
df2 = pd.DataFrame(list2, columns=['姓名', '爱好'], index=[1, 2, 3])
# 根据‘姓名’列进行匹配,lsuffix, rsuffix:在相同变量名后增加后缀,便于区分
print(df1.join(df2, lsuffix='_1', rsuffix='_2'))
# 先将右表‘姓名’列设置为行索引,再与左表的‘姓名’列匹配
print(df1.join(df2.set_index('姓名'), on='姓名'))
# 两表先将‘姓名’列设置为行索引,再进行join连接
print(df1.set_index('姓名').join(df2.set_index('姓名')))
运行结果:
姓名_1 年龄 性别 姓名_2 爱好
1 赵一 23 男 赵一 游泳
4 钱二 27 女 NaN NaN
5 孙三 26 女 NaN NaN
姓名 年龄 性别 爱好
1 赵一 23 男 游泳
4 钱二 27 女 NaN
5 孙三 26 女 NaN
年龄 性别 爱好
姓名
赵一 23 男 游泳
钱二 27 女 NaN
孙三 26 女 NaN
4、df.append([df1, df2...])
a、添加DataFrame表
import pandas as pd
list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
list2 = [['赵一', '游泳'], ['李四', '唱歌'], ['周五', '下棋']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=[1, 4, 5])
df2 = pd.DataFrame(list2, columns=['姓名', '爱好'], index=[1, 2, 3])
res = df1.append(df2)
print(res)
运行结果:
姓名 年龄 性别 爱好
1 赵一 23.0 男 NaN
4 钱二 27.0 女 NaN
5 孙三 26.0 女 NaN
1 赵一 NaN NaN 游泳
2 李四 NaN NaN 唱歌
3 周五 NaN NaN 下棋
b、添加Series序列
import pandas as pd
list1 = [['赵一', 23, '男'], ['钱二', 27, '女'], ['孙三', 26, '女']]
df1 = pd.DataFrame(list1, columns=['姓名', '年龄', '性别'], index=[1, 4, 5])
s1 = pd.Series(['李四', 30, '男'], index=['姓名', '年龄', '性别'], name=7)
# 注: Can only append a Series if ignore_index=True or if the Series has a name
res = df1.append(s1)
print(res)
运行结果:
姓名 年龄 性别
1 赵一 23 男
4 钱二 27 女
5 孙三 26 女
7 李四 30 男
更多推荐
已为社区贡献3条内容
所有评论(0)