[英]Iterate through multiple dataframes and perform calculation based on specific column
[英]Perform addition calculation in a column based on another (grouping by a specific column)
我有一个数据框 df,我想在其中根据不同列中的值执行加法。 加法计算基于id值。
数据
id date value start status
aa Q1.22 hello 80
aa Q2.22 hi -200 2000
aa Q3.22 hey -400
aa Q4.22 sure -500
bb Q3.23 ok 30
bb Q4.23 sure 10 100
想要的
id date value start status update
aa Q1.22 hello 80
aa Q2.22 hi -200 2000 1800
aa Q3.22 hey -400 1400
aa Q4.22 sure -500 900
bb Q3.23 ok 30
bb Q4.23 sure 10 100 110
逻辑
加法将在第一次显示单个值时开始。 例如,我们看到数字 2000 是一个非连续值。 加法计算的起点将从这里开始。 类似于 100 值(它是一个结束值)
我们只是将“开始”列中的值与“状态”列中的值相加。 添加以 id 结束。 加法计算按id分组。
正在做
df = df.groupby(["id"]).sum()
df['update'] = df.groupby(["id"]).sum()['start']
然而,
我仍在研究这个,任何建议表示赞赏。
to_numeric
将status
转换为具有NaN
值的数字groupby ffill
status
列,这将填充向前移动数值(将起始NaN
保留为NaN
Series.mask
从start
然后groupby cumsum
删除不需要的值status
列。df['status'] = pd.to_numeric(df['status'], errors='coerce')
status = df.groupby('id')['status'].ffill()
df['update'] = (
status + df['start'].mask(status.isna()).groupby(df['id']).cumsum()
)
df
:
id date value start status update
0 aa Q1.22 hello 80 NaN NaN
1 aa Q2.22 hi -200 2000.0 1800.0
2 aa Q3.22 hey -400 NaN 1400.0
3 aa Q4.22 sure -500 NaN 900.0
4 bb Q3.23 ok 30 NaN NaN
5 bb Q4.23 sure 10 100.0 110.0
可选地, DataFrame.fillna
添加回空字符串:
df = df.fillna('')
df
:
id date value start status update
0 aa Q1.22 hello 80
1 aa Q2.22 hi -200 2000.0 1800.0
2 aa Q3.22 hey -400 1400.0
3 aa Q4.22 sure -500 900.0
4 bb Q3.23 ok 30
5 bb Q4.23 sure 10 100.0 110.0
步骤分解:
(第 2 步向前填充status
分组)
df.groupby('id')['status'].ffill()
0 NaN
1 2000.0
2 2000.0
3 2000.0
4 NaN
5 100.0
Name: status, dtype: float64
(步骤 3.1 从start
删除不需要的值)
df['start'].mask(status.isna())
0 NaN
1 -200.0
2 -400.0
3 -500.0
4 NaN
5 10.0
Name: start, dtype: float64
(步骤 3.2 cumsum
将保留的值分组)
df['start'].mask(status.isna()).groupby(df['id']).cumsum()
0 NaN
1 -200.0
2 -600.0
3 -1100.0
4 NaN
5 10.0
Name: start, dtype: float64
(第 4 步添加到转发填充status
)
status + df['start'].mask(status.isna()).groupby(df['id']).cumsum()
0 NaN
1 1800.0
2 1400.0
3 900.0
4 NaN
5 110.0
dtype: float64
尝试新的东西
idx = df.groupby('id').status.transform('idxmax')
df['new'] = df.status.add(df.start,fill_value=0)[df.index>=idx].groupby(df['id']).cumsum()
df
Out[270]:
id date value start status new
0 aa Q1.22 hello 80 NaN NaN
1 aa Q2.22 hi -200 2000.0 1800.0
2 aa Q3.22 hey -400 NaN 1400.0
3 aa Q4.22 sure -500 NaN 900.0
4 bb Q3.23 ok 30 NaN NaN
5 bb Q4.23 sure 10 100.0 110.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.