【问题标题】:How to perform reconciliation using DataFrame?如何使用 DataFrame 进行对账?
【发布时间】:2018-02-01 10:58:00
【问题描述】:

假设我有一个每周获取的 DataFrame,并且想要更新一个基于每周报告更新的跟踪器,例如:

这是我收到的每周报告:

ID   Cost
X12  500
X54  100
X52  150
X45  200
X32  435

我有一个用于主要指标跟踪器的 DataFrame,需要根据每周报告进行更新:

ID   Cost
X12  34
X54  467
X52  234
X45  3453
X37  4664    
X76  34
X57  467
X52  23465
X48  547
X32  34

我想从 DataFrame 1 中取出数字并将它们放入 DataFrame 2,这将导致:

ID   Cost
X12  500
X54  100
X52  150
X45  200
X37  4664    
X76  34
X57  467
X56  23465
X48  547
X32  435

我将如何执行这样的功能,从一个 DataFrame 到另一个 DataFrame。我假设我们使用 for 循环并在遍历第一个 DataFrame 时搜索第二个 DataFrame,但我该如何设置呢?

谢谢!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    如果顺序不是问题,那么

    In [1178]: dfw.set_index('ID').combine_first(dfo.set_index('ID')).reset_index()
    Out[1178]:
        ID    Cost
    0  X12   500.0
    1  X32   435.0
    2  X37  4664.0
    3  X45   200.0
    4  X48   547.0
    5  X52   150.0
    6  X52   150.0
    7  X54   100.0
    8  X57   467.0
    9  X76    34.0
    

    这也将处理任何新的ID 添加。

    【讨论】:

    • 我能做到这一点,同时保持我提供的相同顺序吗?
    • 另外,这会跳过 ID 中的 NaN 值吗?
    【解决方案2】:

    你可以使用 map 和 combine_first

    df2['Cost'] = df2['ID'].map(df1.set_index('ID')['Cost']).combine_first(df2['Cost'])
    

    你得到

        ID  Cost
    0   X12 500.0
    1   X54 100.0
    2   X52 150.0
    3   X45 200.0
    4   X37 4664.0
    5   X76 34.0
    6   X57 467.0
    7   X52 150.0
    8   X48 547.0
    9   X32 435.0
    

    【讨论】:

    • 假设我有一个带有 NaN 值的 ID。它会跳过它吗?
    • 在 df1 或 df2 中带有 nan 的 ID?假设我们通过在 df2 中引入 nan 来测试代码,df2.loc[df2.ID == 'X12', 'Cost'] = np.nan。我建议的代码有效。
    【解决方案3】:

    你可以这样做。

    where 
    df -> first dataframe
    df1 -> second dataframe
    

    代码:

    df.loc[df.ID.isin(df1.ID), ['Cost']] = df1[['Cost']]
    print df
    

    参考:

    Replace column values based on another dataframe

    【讨论】:

      【解决方案4】:

      使用drop_duplicates

      rep.append(track).drop_duplicates('ID')
      
          ID  Cost
      0  X12   500
      1  X54   100
      2  X52   150
      3  X45   200
      4  X32   435
      4  X37  4664
      5  X76    34
      6  X57   467
      8  X48   547
      

      如果你想重置你的索引

      rep.append(track).drop_duplicates('ID').reset_index(drop=True)
      
          ID  Cost
      0  X12   500
      1  X54   100
      2  X52   150
      3  X45   200
      4  X32   435
      5  X37  4664
      6  X76    34
      7  X57   467
      8  X48   547
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-05
        • 2020-05-17
        • 2019-08-03
        • 1970-01-01
        • 2019-01-21
        • 1970-01-01
        • 2019-11-28
        相关资源
        最近更新 更多