【问题标题】:updating and merging a column in pandas dataframe更新和合并熊猫数据框中的列
【发布时间】:2025-12-24 17:05:07
【问题描述】:

我在两个数据框中有一列“A”,例如 df1 和 df2。

df1:

|  ID  | A |  |
|------|---|--|
| ID1  | 5 |  |
| ID2  | 6 |  |
| ID3  | 7 |  |
| ID4  | 8 |  |

df2:

|  ID  | A |  |
|------|---|--|
| ID1  | 5 |  |
| ID2  | 1 |  |
| ID3  | 8 |  |
| ID5  | 7 |  |
| ID6  | 8 |  |
| ID7  | 9 |  |

需要更新的df1:

|  ID  | A |  |
|------|---|--|
| ID1  | 5 |  |
| ID2  | 1 |  |
| ID3  | 8 |  |
| ID4  | 8 |  |
| ID5  | 7 |  |
| ID6  | 8 |  |
| ID7  | 9 |  |

如果 ID 在 df2 中,我想用 df2 中的值更新 df1 中的“A”列,否则我想在 df1 中保持相同的值。此外,如果df2中有新的ID,我想在df1中添加新的值。

我看过 pd.DataFrame.update 的文档,它确实将值从 df2 更新到 df1,但它没有将新值添加到 df1。任何帮助将不胜感激。提前致谢。

【问题讨论】:

    标签: python pandas dataframe algorithmic-trading


    【解决方案1】:

    我认为需要:

    df = pd.concat([df1, df2]).drop_duplicates(subset=['ID'], keep='last').sort_values('ID')
    print (df)
        ID  A
    0  ID1  5
    1  ID2  1
    2  ID3  8
    3  ID4  8
    3  ID5  7
    4  ID6  8
    5  ID7  9
    

    解释

    首先concatDataFrame 一起:

    print (pd.concat([df1, df2]))
        ID  A
    0  ID1  5
    1  ID2  6
    2  ID3  7
    3  ID4  8
    0  ID1  5
    1  ID2  1
    2  ID3  8
    3  ID5  7
    4  ID6  8
    5  ID7  9
    

    因为创建了相同的ID,所以删除drop_duplicates 的重复项,只保留最后一个值:

    print (pd.concat([df1, df2]).drop_duplicates(subset=['ID'], keep='last'))
        ID  A
    3  ID4  8
    0  ID1  5
    1  ID2  1
    2  ID3  8
    3  ID5  7
    4  ID6  8
    5  ID7  9
    

    最后按ID 排序sort_values

    【讨论】:

    • 那行得通。谢谢。只是想知道当你还是初学者时你是如何遇到这些方法的。我如何在互联网上寻找这样的方法。
    • 谢谢@jezreal,如果你能告诉我你是如何学会在熊猫上做这些操作的,那会很有帮助。你能建议我应该遵循的路径吗?
    • @MohitAneja - 很难的问题,我真的很喜欢tutorials,尤其是modern pandas
    【解决方案2】:

    你可以使用 Pandas 的合并方法来做同样的事情。

    您可以使用合并函数合并 df1 和 df2,如下所示:

    df = pd.merge(df2,df1, how ='outer')
    

    这里我将 df2 与 df1 合并。外部使用来自两个数据帧的键的联合。 Union 将从 df2 中获取所有密钥,并且仅从 df1 中获取那些在 df2 中不可用的密钥。

    第二步是考虑ID列删除重复行。

    df = df.drop_duplicates(subset=['ID'],keep='first')
    

    这将删除列 ID 中的所有重复行,但第一次出现的行除外。

    第三步是考虑ID列对行进行排序。

    df =df.sort_values('ID')
    

    【讨论】: