【问题标题】:update one dataframe with data from another, for one specific column - Pandas and Python使用来自另一个数据框的数据更新一个数据框,用于一个特定列 - Pandas 和 Python
【发布时间】:2018-11-05 07:18:42
【问题描述】:

我正在尝试使用来自另一个数据框的数据更新一个数据框,用于一个名为“数据”的特定列。两个数据框都有唯一的 ID,称为“ID”列。两列都有一个“数据”列。我希望 df2 中的“数据”中的数据覆盖 df1“数据”中的条目,仅用于 df1 中的行数。如果 df2 中没有对应的“ID”,则应保留 df1 条目。

import pandas as pd

data1 = '''\
ID Data Data1
1  AA   BB
2  AB   BF
3  AC   BK
4  AD   BL'''

data2 = '''\
ID Data
1  AAB
3  AAL
4  MNL
5  AAP
6  MNX
8  DLP
9  POW'''

df1 = pd.read_csv(pd.compat.StringIO(data1), sep='\s+')
df2 = pd.read_csv(pd.compat.StringIO(data2), sep='\s+')

预期输出:

new df3 expected outcome.

ID Data Data1
1  AAB  BB
2  AB   BF
3  AAL  BK
4  MNL  BL

df2 是一个永远不会改变并且有数千个条目的值的主列表,而 df1 有时只有几百个条目。

我查看了 pd.merge 和 combine_first 但似乎无法获得正确的组合。

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

非常感谢任何帮助。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    创建新数据框

    这是使用更新的一种方式:

    df3 = df1[:].set_index('ID')
    df3['Data'].update(df2.set_index('ID')['Data'])
    df3.reset_index(inplace=True)
    

    或者我们可以使用 maps/dicts 并重新分配 (Python >= 3.5)

    m = {**df1.set_index('ID')['Data'], **df2.set_index('ID')['Data']}
    df3 = df1[:].assign(Data=df1['ID'].map(m))
    

    Python

    m = df1.set_index('ID')['Data']
    m.update(df2.set_index('ID')['Data'])
    
    df3 = df1[:].assign(Data=df1['ID'].map(m))
    

    更新 df1

    您愿意更新 df1 吗?在这种情况下:

    df1.update(df2)
    

    或者如果 ID 没有索引:

    m = df2.set_index('ID')['Data']
    df1.loc[df1['ID'].isin(df2['ID']),'Data'] =df1['ID'].map(m)
    

    或者:

    df1.set_index('ID',inplace=True)
    df1.update(df2.set_index('ID'))
    df1.reset_index(inplace=True)
    

    注意:可能有些东西更有意义:)


    完整示例:

    import pandas as pd
    
    data1 = '''\
    ID Data Data1
    1  AA   BB
    2  AB   BF
    3  AC   BK
    4  AD   BL'''
    
    data2 = '''\
    ID Data
    1  AAB
    3  AAL
    4  MNL
    5  AAP
    6  MNX
    8  DLP
    9  POW'''
    
    df1 = pd.read_csv(pd.compat.StringIO(data1), sep='\s+')
    df2 = pd.read_csv(pd.compat.StringIO(data2), sep='\s+')
    
    m = {**df1.set_index('ID')['Data'], **df2.set_index('ID')['Data']}
    df3 = df1[:].assign(Data=df1['ID'].map(m))
    
    print(df3)
    

    返回:

       ID Data Data1
    0   1  AAB    BB
    1   2   AB    BF
    2   3  AAL    BK
    3   4  MNL    BL
    

    【讨论】:

      猜你喜欢
      • 2019-07-26
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      相关资源
      最近更新 更多