pandas - 如何按,在哪里,总和做一个适当的熊猫组
问题描述
我很难使用 group by + where 将总和应用于更广泛的范围。
鉴于此代码:
from io import StringIO
import numpy as np
f = pd.read_csv(StringIO("""
fund_id,l_s,val
fund1,L,10
fund1,L,20
fund1,S,30
fund2,L,15
fund2,L,25
fund2,L,35
"""))
# fund total - works as expected
f['fund_total'] = f.groupby('fund_id')['val'].transform(np.sum)
# fund L total - applied only to L rows.
f['fund_total_l'] = f[f['l_s'] == "L"].groupby('fund_id')['val'].transform(np.sum)
f
数字是正确的,但我希望fund_total_l
列显示30
fund1 的所有行(不仅仅是L
)。我想要一个基金水平摘要,但总和按l_s
列过滤
我知道我可以通过多个步骤来做到这一点,但这需要一个单一的操作。如果有帮助,我可以使用单独的通用函数。
解决方案
使用Series.where
, 来创建NaN
,这些将在您的sum
:
f['val_temp'] = f['val'].where(f['l_s'] == "L")
f['fund_total_l'] = f.groupby('fund_id')['val_temp'].transform('sum')
f = f.drop(columns='val_temp')
或在一行中使用assign
:
df['fun_total_l'] = (
f.assign(val_temp=f['val'].where(f['l_s'] == "L"))
.groupby('fund_id')['val_temp'].transform('sum')
)
另一种方法是部分使用您的解决方案,然后使用DataFrame.reindex
来获取原始索引,然后使用ffill
并bfill
填充我们的NaN
:
f['fund_total_l'] = (
f[f['l_s'] == "L"]
.groupby('fund_id')['val']
.transform('sum')
.reindex(f.index)
.ffill()
.bfill()
)
fund_id l_s val fund_total_l
0 fund1 L 10 30.0
1 fund1 L 20 30.0
2 fund1 S 30 30.0
3 fund2 L 15 75.0
4 fund2 L 25 75.0
5 fund2 L 35 75.0
推荐阅读
- javascript - 如果单击按钮,如何删除输入字段?
- django - 使用两个提交按钮将 django inlineformset 保存为草稿
- vb.net - 在 VB.Net 的 Listview 中更改下载百分比
- ios - 当wifi和移动数据之间发生切换时,有没有办法使用NE Packet Tunnel Provider重置iOS中的隧道?
- batch-file - 从 vs 2019 运行 bat 文件时找不到文件
- php - Symfony / Ajax:成功响应时调用函数
- java - 如何在 JSP 文件中运行 Java 8 lambda
- r - 如何包含一个有条件地计算 R 中数据集行的变量?
- java - 如何在 Spring Boot 中为 /error 页面返回自定义错误消息
- postgresql - 用于同时运行的查询的 Tempo 表抛出已存在错误