使用 pandas 连接两个数据框中的不同列(并附加相似的列)

Posted

技术标签:

【中文标题】使用 pandas 连接两个数据框中的不同列(并附加相似的列)【英文标题】:Concatenate distinct columns in two dataframes using pandas (and append similar columns) 【发布时间】:2019-03-07 23:19:51 【问题描述】:

我的问题与Pandas Merge - How to avoid duplicating columns 密切相关但不完全相同。

我想连接三个数据框中不同的列。数据框有一个列 id,以及一些相同的列:例如。

df1

id place name qty unit A 
1 NY    Tom   2  10   a
2 TK    Ron   3  15   a
3 Lon   Don   5  90   a
4 Hk    Sam   4  49   a

df2

id place name qty unit B 
1 NY    Tom   2  10   b
2 TK    Ron   3  15   b
3 Lon   Don   5  90   b
4 Hk    Sam   4  49   b

df3

id place name qty unit C D
1 NY    Tom   2  10   c d
2 TK    Ron   3  15   c d
3 Lon   Don   5  90   c d
4 Hk    Sam   4  49   c d

结果:

id place name qty unit A B C D
1 NY    Tom   2  10   a b c d
2 TK    Ron   3  15   a b c d
3 Lon   Don   5  90   a b c d
4 Hk    Sam   4  49   a b c d

位置、名称、数量和单位列始终是三个数据框的一部分,不同的列名称可能会有所不同(在我的示例中为 A、B、C、D)。三个数据框的行数相同。

我试过了:

cols_to_use = df1.columns - df2.columns
dfNew = merge(df, df2[cols_to_use], left_index=True, right_index=True, how='outer')

问题是我得到了比预期更多的行,并且在结果数据框中重命名了列(使用 concat 时)。

【问题讨论】:

【参考方案1】:

使用来自functoolsreduce

from functools import reduce
reduce(lambda left,right: pd.merge(left,right), [df1,df2,df3])
Out[725]: 
   id place name  qty  unit  A  B  C  D
0   1    NY  Tom    2    10  a  b  c  d
1   2    TK  Ron    3    15  a  b  c  d
2   3   Lon  Don    5    90  a  b  c  d
3   4    Hk  Sam    4    49  a  b  c  d

【讨论】:

非常好,是时候回到文档了 :) 太棒了!你认为这个解决方案会是最有效的吗?我有一个大数据集。 @mig 实际尺寸是多少? @wen 大约 20000 行(流) @mig 所有功能都应该可以工作,20000 行不算大,我通常使用 1000 万行,合并和 concat 都适合我。【参考方案2】:

你可以使用嵌套合并

merge_on = ['id','place','name','qty','unit']
df1.merge(df2, on = merge_on).merge(df3, on = merge_on)



    id  place   name    qty unit    A   B   C   D
0   1   NY      Tom     2   10      a   b   c   d
1   2   TK      Ron     3   15      a   b   c   d
2   3   Lon     Don     5   90      a   b   c   d
3   4   Hk      Sam     4   49      a   b   c   d

【讨论】:

也许与df= reduce(lambda left,right: pd.merge(left,right'), dfs)核实 嗯,好的,已发布 谢谢!我会试试的【参考方案3】:

concatgroupbyfirst 一起使用:

pd.concat([df1, df2, df3], 1).groupby(level=0, axis=1).first()

   A  B  C  D  id name place  qty  unit
0  a  b  c  d   1  Tom    NY    2    10
1  a  b  c  d   2  Ron    TK    3    15
2  a  b  c  d   3  Don   Lon    5    90
3  a  b  c  d   4  Sam    Hk    4    49

【讨论】:

【参考方案4】:

您只能从df2(和df3 类似)中提取那些在df1 中尚不存在的列。然后只需使用pd.concat 连接数据帧:

cols = [c for c in df2.columns if c not in df1.columns]
df = pd.concat([df1, df2[cols]], axis=1)

【讨论】:

以上是关于使用 pandas 连接两个数据框中的不同列(并附加相似的列)的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 数据框中的不同列上使用 lambda if 条件

如何将多个列值连接到 Pandas 数据框中的单个列中

将不同类型的 CSV 字符串加载到 Pandas 数据框中,拆分列,解析日期

pandas:合并两个不同名称的列?

对 pandas 数据框中的列使用 map()

将 Pandas 数据框中的所有列相乘