首页 > 解决方案 > 如何使用非唯一列将具有总和值的熊猫 Groupby 数据帧映射到另一个数据帧

问题描述

我有两个熊猫数据框 df1df2。我需要df1['seq']通过对列进行分组df2并求和来找到哪里df2['sum_column']。以下是示例数据和我当前的解决方案。

df1

id    code amount  seq
234     3    9.8    ?
213     3    18
241     3    6.4
543     3    2
524     2    1.8
142     2    14
987     2    11
658     3    17

df2

c_id  name role    sum_column
1     Aus  leader    6
1     Aus  client    1
1     Aus  chair     7
2     Ned  chair     8
2     Ned  leader    3
3     Mar  client    5
3     Mar  chair     2
3     Mar  leader    4

grouped = df2.groupby('c_id')['sum_column'].sum()
df3 = grouped.reset_index()

df3

c_id  sum_column
 1      14
 2      11
 3      11

遇到问题的下一步是将df3映射到df1并进行条件检查以查看是否df1['amount']大于 then df3['sum_column']

df1['seq'] = np.where(df1['amount'] > df1['code'].map(df3.set_index('c_id')[sum_column]), 1, 0)

打印出来df1['code'].map(df3.set_index('c_id')['sum_column']),我只得到NaN值。

有谁知道这里做错了什么?

预期结果: df1

id    code amount  seq
234     3    9.8    0
213     3    18     1
241     3    6.4    0
543     3    2      0
524     2    1.8    0
142     2    14     1
987     2    11     0
658     3    17     1

标签: pythonpandas

解决方案


解决方案应简化为 remove .reset_index()fordf3并传递Seriesmap

s = df2.groupby('c_id')['sum_column'].sum()
df1['seq'] = np.where(df1['amount'] > df1['code'].map(s), 1, 0)

将布尔掩码转换为整数的替代True, False方法1,0

df1['seq'] = (df1['amount'] > df1['code'].map(s)).astype(int)

print (df1)
    id  code  amount  seq
0  234     3     9.8    0
1  213     3    18.0    1
2  241     3     6.4    0
3  543     3     2.0    0
4  524     2     1.8    0
5  142     2    14.0    1
6  987     2    11.0    0
7  658     3    17.0    1

推荐阅读