pandas多表拼接(merge, join, concat)

可参考pd.merge
python中多表拼接简要概括(参考张俊红的书《对比excel学python数据分析》),以便自我查阅:
merge() 主要用于多表横向拼接
concat() 主要用于纵向拼接

1,merge()横向拼接
(一)当能够找到公共列(两表中该列内容完全一样):
(1)默认会自动寻找两个表的公共列
(2)用on指定连接键,一般指定的也是两个表的公共列,on可以指定一个或多个连接键
如pd.merge(df1,df2,on=‘学号’)
或者pd.merge(df1,df2,on=[‘姓名’,‘学号’])
(3)分别指定左右连接键:当两表没有公共列(此处指实际值一样,但列名不同,如‘编号’和‘学号’,实际值都是学号),用left_on和right_on分别指定左表和右表用作连接键的列名,本质上还是自动寻找两个表的公共列
(4)把索引列当作连接键(两表的公共列是索引列):left_index=True, right_index=True
或者left_index=True, right_on=‘学号’,表示左表连接键作为索引、右边连接键作为普通列

(二)当两表找不到完全一致的公共列(如df1中‘姓名’列包含‘小张’、‘小王’,df2中‘姓名’列包含‘小张’、‘小李’),采用how参数指明连接方式
(1)内连接(how=‘inner’),两表做交集,采用公共部分
(2)左连接(how=‘left’),以左表为基础,右表往左表上拼接(左表全保留,右表根据左表增删,左表中有、右表没有的部分,拼接过来用NaN填充)
(3)右连接(how=‘right’),以右表为基础,其他同上
(4)外连接(how=‘outer’),两表做并集,缺失的部分用NaN填补
注:非连接列出现重复列名时,merge()会自动添加后缀_x,_y,_z等,可通过suffixes=[’_L’,’_R’]等方式修改

2,concat()纵向拼接,一般是若干个数据结构相同的表格进行垂直方向拼接
pd.concat([df1,df2])
(1)默认保留原表索引,如df1和df2索引都为1234,则concat后索引为12341234
ignore_index=True,不保留原索引,重新生成一组索引01234567
(2) 重复值处理,若df1中‘姓名’列有‘小张’、‘小李’,df2的‘姓名’列有‘小王’、‘小李’,pd.concat(df1,df2)之后‘小李’出现两次,采用drop_duplicates()删除重复值
如pd.concat([df1,df1],ignore_index=True).drop_duplicates()

3,关于join()功能类似于merge(),用于横向拼接
区别在于join只有一种连接键(索引作为连接键),而merge()有多种连接方式
df1.join(df2) ,df1和df2索引一致
若df1和df2索引不一致但有公共列(列名为‘ID’),则可先将公共列设为索引,再join,如:
df=df1.set_index(‘ID’).join(df2.set_index(‘ID’))
参考https://stackoverflow.com/questions/22676081/what-is-the-difference-between-join-and-merge-in-pandas
‘the related DataFrame.join method, uses merge internally for the
index-on-index and index-on-column(s) joins, but joins on indexes by
default rather than trying to join on common columns (the default
behavior for merge). If you are joining on index, you may wish to
use DataFrame.join to save yourself some typing.’

  • 21
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Pandas中有三种常见的数据拼接方式: 1. concatenate(连接):沿着一个轴将多个数据堆叠在一起。 2. merge(合并):根据一个或多个键将不同的数据连接在一起。 3. join(联接):根据索引将不同的数据连接在一起。 下面是各种拼接方式的示例: 1. concatenate ```python import pandas as pd # 创建两个数据 df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}) df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'], 'B': ['B4', 'B5', 'B6', 'B7'], 'C': ['C4', 'C5', 'C6', 'C7'], 'D': ['D4', 'D5', 'D6', 'D7']}) # 沿着行方向将两个数据连接起来 result = pd.concat([df1, df2]) print(result) ``` 输出结果: ``` A B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3 0 A4 B4 C4 D4 1 A5 B5 C5 D5 2 A6 B6 C6 D6 3 A7 B7 C7 D7 ``` 2. merge ```python import pandas as pd # 创建两个数据 df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']}) df2 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}) # 根据 key 列将两个数据连接起来 result = pd.merge(df1, df2, on='key') print(result) ``` 输出结果: ``` key A B C D 0 K0 A0 B0 C0 D0 1 K1 A1 B1 C1 D1 2 K2 A2 B2 C2 D2 3 K3 A3 B3 C3 D3 ``` 3. join ```python import pandas as pd # 创建两个数据 df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']}, index=['K0', 'K1', 'K2', 'K3']) df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}, index=['K0', 'K1', 'K2', 'K3']) # 根据索引将两个数据连接起来 result = df1.join(df2) print(result) ``` 输出结果: ``` A B C D K0 A0 B0 C0 D0 K1 A1 B1 C1 D1 K2 A2 B2 C2 D2 K3 A3 B3 C3 D3 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值