熊猫中的列连接
Posted
技术标签:
【中文标题】熊猫中的列连接【英文标题】:Column concatenation in pandas 【发布时间】:2018-08-26 23:10:45 【问题描述】:我有 2 个索引不均匀的数据框:
我想将这两个数据框df1
和df2
合并到df3
中,但是我无法使用以下代码:
df3 = pd.concat(df1,df2,axis=1)
请帮忙:如何连接?
我想到达这个数据框:
【问题讨论】:
【参考方案1】:您需要在两个Dataframe
s 中使用相同的索引值来对齐,所以使用reset_index
和drop=True
作为默认唯一索引:
new = pd.concat([df1.reset_index(drop=True),df2.reset_index(drop=True)],axis=1)
另一种解决方案,如果索引长度相同:
df2.index = df1.index
new = pd.concat([df1,df2],axis=1)
示例:
df1 = pd.DataFrame(x: pd.Series(range(4)).astype(str).radd(x) for x in list('ABCD'))
print (df1)
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
df2 = pd.DataFrame('E':['E0','E1','E2','E3'], index=[4,5,6,7])
print (df2)
E
4 E0
5 E1
6 E2
7 E3
new = pd.concat([df1.reset_index(drop=True),df2.reset_index(drop=True)],axis=1)
print (new)
A B C D E
0 A0 B0 C0 D0 E0
1 A1 B1 C1 D1 E1
2 A2 B2 C2 D2 E2
3 A3 B3 C3 D3 E3
此方法更通用,因此如果需要具有可能相同列名的新列,可以添加参数keys
,然后在列中展平MultiIndex
:
df2 = pd.DataFrame('A':['E0','E1','E2','E3'], index=[4,5,6,7])
print (df2)
A
4 E0
5 E1
6 E2
7 E3
new=pd.concat([df1.reset_index(drop=True),df2.reset_index(drop=True)],axis=1, keys=('a','b'))
new.columns = new.columns.map('_'.join)
print (new)
a_A a_B a_C a_D b_A
0 A0 B0 C0 D0 E0
1 A1 B1 C1 D1 E1
2 A2 B2 C2 D2 E2
3 A3 B3 C3 D3 E3
【讨论】:
谢谢@jezrael。它有帮助 @AhamedMoosa - 很高兴能帮上忙!【参考方案2】:
pd.DataFrame.join
+ pd.DataFrame.set_index
df1.join(df2.set_index(df1.index))
A B C D E
0 A0 B0 C0 D0 E0
1 A1 B1 C1 D1 E1
2 A2 B2 C2 D2 E2
3 A3 B3 C3 D3 E3
pd.DataFrame.assign
df1.assign(**df2.to_dict('l'))
A B C D E
0 A0 B0 C0 D0 E0
1 A1 B1 C1 D1 E1
2 A2 B2 C2 D2 E2
3 A3 B3 C3 D3 E3
工作原理
assing
采用关键字参数,其中键是新列的名称,值是分配给该列的内容。好吧,我们可以使用 double-splat **
将字典解压缩为关键字参数。碰巧的是,我可以使用df2.to_dict
从另一个数据框中获取这样的字典。只是,我需要指定我希望以'list'
方向显示的字典,我可以缩写为'l'
。
注意事项 虽然这个解决方案很聪明,但也有一些限制。正如 jezrael 在 cmets 中提出的。我在介绍已经存在的列时受到限制。这些列将被覆盖。此外,如果您的列名是数字,则无法使用,因为这些列名必须是字符串。
设置
df1 = pd.DataFrame([list('0123')], list('ABCD')).T.pipe(lambda d: d.radd(d.columns))
df2 = pd.DataFrame(dict(E='E0 E1 E2 E3'.split()), [4, 5, 6, 7])
print(df1, df2, sep='\n\n')
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
E
4 E0
5 E1
6 E2
7 E3
【讨论】:
还要说一下限制 - 列名不同,列名也不同:)以上是关于熊猫中的列连接的主要内容,如果未能解决你的问题,请参考以下文章