python - 如何使用非唯一列将具有总和值的熊猫 Groupby 数据帧映射到另一个数据帧
问题描述
我有两个熊猫数据框 df1和df2。我需要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
解决方案
解决方案应简化为 remove .reset_index()
fordf3
并传递Series
给map
:
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
推荐阅读
- javascript - 父组件vue没有收到事件
- javascript - 重新开始测验的功能
- r - 在 R 中绘制圆形随机变量的 PDF(极坐标图)
- javascript - 条件始终为假,因为类型“字符串”在 Javascript 中没有重叠错误
- regex - 正则表达式 (PCRE) 匹配单词之间的单词
- python - 如何使用 Python 请求登录网站
- excel - 如何使用 VBA for excel 制作一个复制按钮
- python - ValueError:标签形状不匹配。预期的标签维度 = 1。收到 10
- c# - 是“策略”还是“模板方法”模式?
- json - 来自 API 调用的 Django 模型