【问题标题】:How do I merge two data frames if a column and it's values exist in both data frames?如果列及其值存在于两个数据框中,如何合并两个数据框?
【发布时间】:2019-05-14 02:20:27
【问题描述】:

如果列在两个数据框中都有值,我如何合并两个数据框?

数据框 1 - df1

    A   B   C
0   'name1' 'foo'   'bar'
1   'name2' 'foo''  'bar'
2   'name3' 'foo'   NaN
3   'name4' 'foo'   NaN

数据框 2 - df2

    A   C
0   'name3' 'bar'
1   'name4' 'bar'

我试过了:

pd.merge(df1, df2, how='left', on='A')

但这并不能创建所需的输出。

这是一个完整的最小示例:

import pandas as pd
from io import StringIO
csv1 = """A,B,C
'name1','foo','bar'
'name2','foo'','bar'
'name3','foo',
'name4','foo',
"""

csv2 = """A,C
'name3','bar'
'name4','bar'
"""
df1 = pd.read_csv(StringIO(csv1), header=0)
df2 = pd.read_csv(StringIO(csv2), header=0)

pd.merge(df1, df2, how='left', on='A')

我想要这个:

    A   B   C
0   'name1' 'foo'   'bar'
1   'name2' 'foo''  'bar'
2   'name3' 'foo'   'bar'
3   'name4' 'foo'   'bar'

但是得到这个:

    A   B   C_x C_y
0   'name1' 'foo'   'bar'   NaN
1   'name2' 'foo''  'bar'   NaN
2   'name3' 'foo'   NaN 'bar'
3   'name4' 'foo'   NaN 'bar'

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    IIUC,你可以df.combine_first()哪个

    使用其他相同位置的值更新 null 元素。

    df1.set_index('A').combine_first(df2.set_index('A')).reset_index()
    

            A       B      C
    0  'name1'   'foo'  'bar'
    1  'name2'  'foo''  'bar'
    2  'name3'   'foo'  'bar'
    3  'name4'   'foo'  'bar'
    

    【讨论】:

    • 非常感谢您快速而完美的回答!
    【解决方案2】:

    如果真实案例数据在同一位置没有NaN,则combine_first可能会失败,在这种情况下您可以使用pd.merge和Series.fillna:

    df = pd.merge(df1, df2, how='left', on='A', suffixes=['', '_2'])
    df['C'].fillna(df['C_2'], inplace=True)
    df.drop('C_2', axis=1, inplace=True)
    

             A      B      C
    0  'name1'  'foo'  'bar'
    1  'name2'  'foo'  'bar'
    2  'name3'  'foo'  'bar'
    3  'name4'  'foo'  'bar'
    

    【讨论】:

      【解决方案3】:

      如果你需要使用merge,我试过这样:

      df3= pd.merge(df, df2, how='left',  on=['A','C'])
      print(df3)
      

               A       B      C
      0  'name1'   'foo'  'bar'
      1  'name2'  'foo''  'bar'
      2  'name3'   'foo'    NaN
      3  'name4'   'foo'    NaN
               A      C
      0  'name3'  'bar'
      1  'name4'  'bar'
               A       B      C
      0  'name1'   'foo'  'bar'
      1  'name2'  'foo''  'bar'
      2  'name3'   'foo'    NaN
      3  'name4'   'foo'    NaN
      

      其他答案要好得多,但肯定需要使用内连接(默认为合并),并且可以使用 C 列 ffill,这很简单,如 df3.C = df3.C.ffill()

      【讨论】:

        猜你喜欢
        • 2019-05-01
        • 1970-01-01
        • 2021-01-11
        • 2018-01-30
        • 1970-01-01
        • 1970-01-01
        • 2021-05-27
        • 2020-11-05
        • 1970-01-01
        相关资源
        最近更新 更多