【问题标题】:Update Multiple Dataframe Columns From Other Dataframe从其他数据框更新多个数据框列
【发布时间】:2020-04-10 21:32:23
【问题描述】:

我有两个数据框:

df1

         Date         ID Company     Symbol  Shares  Value
0  2014-09-30   32511907     foo        NaN      10    101
1  2014-09-30   32511957     bar  No Symbol      10    101
2  2014-12-31   32511907    test  No Symbol      18    152
3  2013-06-30   32511107      AA        APC      43    373
4  2014-06-30  166764100      CC        CVX      29    381
5  2014-09-30  166764900       C  No Symbol      13    155
6  2014-09-30  166764950   C Inc  No Symbol      13    155
7  2015-09-30  475643276    Test        NaN      13    155

还有df2

   Company         ID     Symbol
0   AA Inc   32511907        AAA
1   AA Inc   32511957  No Symbol
2   BB Inc   32511107        APC
3  CC Corp  166764100        CVX
4   CC Inc  166764900  No Symbol
5   CC Inc  166764950  No Symbol

通过使用ID作为键,我需要将df1中的SymbolCompany替换为df2中的那些,这样输出看起来像:

         Date         ID Company     Symbol  Shares  Value
0  2014-09-30   32511907  AA Inc        AAA      10    101
1  2014-09-30   32511957  AA Inc  No Symbol      10    101
2  2014-12-31   32511907  AA Inc        AAA      18    152
3  2013-06-30   32511107  BB Inc        APC      43    373
4  2014-06-30  166764100 CC Corp        CVX      29    381
5  2014-09-30  166764900  CC Inc  No Symbol      13    155
6  2014-09-30  166764950  CC Inc  No Symbol      13    155
7  2015-09-30  475643276    Test        NaN      13    155

我试过了:

df = df1.set_index('ID')
df.update(df2.set_index('ID'))
df = df1.loc[df1.Symbol == '', ['Company', 'Symbol']] = df.reset_index()

但是当在整个数据集上执行时,我得到了ValueError: cannot reindex from a duplicate axis,因为df.update(df2.set_index('ID')) 行使ID 成为索引,这导致了一些重复。

那么有没有其他方法可以实现所需的输出?

【问题讨论】:

  • 请提供minimal reproducible example,以及完整的错误消息。无论如何,我会考虑合并,例如参见pandas.pydata.org/pandas-docs/stable/user_guide/merging.html
  • 如果在df2 中有两倍相同的ID,您想使用哪一行来更新df1
  • @MSD 我只是在谈论重复 ID 列,所以试试 df2['ID'].shape[0]df2['ID'].drop_duplicates().shape[0]?
  • 是的,就是这样。我觉得自己像个白痴……非常感谢。
  • @MSD 有时在编码时你看不到愚蠢的错误,因为你离它太近了:) 玩得开心编码!

标签: python pandas dataframe join


【解决方案1】:

pd.merge 可以解决这个问题。假设您只需要 df1 中的 ID

result = pd.merge(left=df1[['Date', 'ID', 'Shares', 'Values']], 
                  right=df2, on=['ID'], how='left')

如果需要在不同的标签上进行合并,可以使用left_on和right_on。

更改 how 参数以指定要保留的 ID

  • 保留 ID 仅出现在 df1('left')中
  • 保留 ID 仅出现在 df2('right')中
  • 保留 所有 ID 出现在 df1 和 df2('outer')中
  • 保留在 df1 和 df1('inner')中出现的 ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2020-02-18
    • 2019-06-16
    • 2021-05-12
    • 2017-01-03
    • 2018-09-06
    相关资源
    最近更新 更多