【问题标题】:How to merge dataframes on one column while aligning the other columns in common如何在同一列上合并数据框,同时对齐其他列
【发布时间】:2021-03-28 15:03:48
【问题描述】:

考虑两个 DataFrame:

>>> df1 = pd.DataFrame({'key': [1, 2, 3, 4, 5],
                    'bar': ['w','x','y','z','h'],
                    'foo': ['A', 'B', 'C', 'D','E']})
>>> df2 = pd.DataFrame({'key': [1, 2, 3, 8, 9, 10],
                    'foo': [np.nan, np.nan, np.nan, 'I','J','K']})

假设我们想在 'key' 上加入 DataFrame,以便只返回 df1 中的键,除了 df2 中大于 8 的键。您可以这样做

  1. 首先通过df3 = pd.merge(df1,df2,on='key',how='left') 进行左连接
  2. 然后,通过df4 = pd.merge(df3,df2.loc[df2['key']>8],on='key',how='outer') 与 df2 切片进行外连接

但是,不是在每个 DataFrame 中对齐列 'foo',而是将每个“foo”列作为离散列添加到 df4,并添加后缀以区分它们。而且,需要几行代码来组合三个'foo' 列,这样我就有一个只有一个'foo' 列的DataFrame。有没有更简洁的方法来做到这一点?

编辑:

我想我的例子掩盖了真正的问题。让我们使用这些 DataFrame:

>>> df1 = pd.DataFrame({'key': [1, 2, 3, 4, 5],
                    'bar': ['w','x','y','z','h'],
                    'foo': [np.nan, np.nan, 'C', 'D','E'],})
>>> df2 = pd.DataFrame({'key': [1, 2, 3, 8, 9, 10],
                    'foo': ['A', 'B', np.nan, 'I','J','K']})

如果我如上所述使用左连接然后外连接,我会得到这个...

key bar foo_x   foo_y   foo
0   1   w   NaN A   NaN
1   2   x   NaN B   NaN
2   3   y   C   NaN NaN
3   4   z   D   NaN NaN
4   5   h   E   NaN NaN
5   9   NaN NaN NaN J
6   10  NaN NaN NaN K

因为合并三个'foo' 列将需要很多行代码,我想知道是否有更简洁的方法来完成这一切。也就是说,合并两个 DataFrame 并合并 'foo' 列,使得返回的 DataFrame 是这样的:

    key bar foo
0   1   w   A
1   2   x   B
2   3   y   C
3   4   z   D
4   5   h   E
5   9   NaN J
6   10  NaN K

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    让我们试试concatgroupby

    (pd.concat((df1, df2.query('key>8')))
       .groupby('key',as_index=False).first()
    )
    

    输出:

       key foo  bar
    0    1   A    w
    1    2   B    x
    2    3   C    y
    3    4   D    z
    4    5   E    h
    5    9   J  NaN
    6   10   K  NaN
    

    【讨论】:

    • 虽然这适用于第一组 DataFrame,但我编辑了问题并添加了两个不同的 DataFrame,以更好地说明我实际尝试做的事情。对于新的 DataFrame,此解决方案不起作用。
    猜你喜欢
    • 2018-07-23
    • 2019-02-25
    • 1970-01-01
    • 2020-10-24
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2019-06-09
    相关资源
    最近更新 更多