【问题标题】:Increasing a value during merge in pandas在熊猫合并期间增加一个值
【发布时间】:2021-09-03 03:43:02
【问题描述】:

我有 2 个数据框

df1

product_id      value       name
abc             10          a
def             20          b
ggg             10          c

df2 我使用df2.groupby(['prod_id'])['code'].count().reset_index()后得到的

prod_id         code
abc             10
def             20
ggg             10
ooo             5
hhh             1

我想合并从df2df1 的值,左边是product_id,右边是prod_id

获得:

product_id      value       name
abc             20          a
def             40          b
ggg             20          c

我试过了:

pd.merge(df1, df2.groupby(['prod_id'])['code'].count().reset_index(), 
         left_on='product_id', right_on='prod_id', how='left')

返回 df1 和 2 个附加列 prod_idcode,其中 code 列包含我想在 df1 中增加 value 的数量。现在我可以只添加这 2 列,但我想避免这种情况。

【问题讨论】:

  • “现在我可以只添加这 2 列,但我想避免这种情况。”:这似乎是最简单和最清晰(也可能是最快)的方式;目前还不清楚为什么你想避免这种情况。
  • 我相信pandas 有一个程序,这将是此类任务的最佳实践,我认为我的不是。

标签: python pandas list numpy dictionary


【解决方案1】:

这是另一种选择:

df1['value'] = df1.product_id.map(dict(df2.values)).fillna(0).add(df1.value)

完整示例:

df1 = pd.DataFrame({'product_id': {0: 'abc', 1: 'def', 2: 'ggg'},
                    'value': {0: 10, 1: 20, 2: 10},
                    'name': {0: 'a', 1: 'b', 2: 'c'}})

df2 = pd.DataFrame({'prod_id': {0: 'abc', 1: 'def', 2: 'ggg', 3: 'ooo', 4: 'hhh'},
                    'code': {0: 10, 1: 20, 2: 10, 3: 5, 4: 1}})

df1['value'] = df1.product_id.map(dict(df2.values)).fillna(0).add(df1.value)

输出:

  product_id  value name
0        abc     20    a
1        def     40    b
2        ggg     20    c

【讨论】:

    【解决方案2】:

    您可以在 df2 上使用 reindex,在 groupby.count 之后(不带 reset_index),使用 df1 product_id 的顺序。喜欢

    df1['value'] += (
        df2.groupby(['prod_id'])
        ['code'].count()
        .reindex(df1['product_id'], fill_value=0)
        .to_numpy()
    )
    

    【讨论】:

      猜你喜欢
      • 2016-11-09
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      相关资源
      最近更新 更多