熊猫中的列连接

Posted

技术标签:

【中文标题】熊猫中的列连接【英文标题】:Column concatenation in pandas 【发布时间】:2018-08-26 23:10:45 【问题描述】:

我有 2 个索引不均匀的数据框:

我想将这两个数据框df1df2 合并到df3 中,但是我无法使用以下代码:

df3 = pd.concat(df1,df2,axis=1) 

请帮忙:如何连接?

我想到达这个数据框:

【问题讨论】:

【参考方案1】:

您需要在两个Dataframes 中使用相同的索引值来对齐,所以使用reset_indexdrop=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

【讨论】:

还要说一下限制 - 列名不同,列名也不同:)

以上是关于熊猫中的列连接的主要内容,如果未能解决你的问题,请参考以下文章

更改熊猫中的列类型

更改熊猫中的列类型

根据熊猫中的条件删除重复的列

如何使用列表重命名熊猫中的列

熊猫数据框中的列级解析

熊猫:重命名多索引df中的列标签