繁体   English   中英

在基于另一列的列中执行加法计算(按特定列分组)

[英]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']

然而,

我仍在研究这个,任何建议表示赞赏。

  1. to_numericstatus转换为具有NaN值的数字
  2. groupby ffill status列,这将填充向前移动数值(将起始NaN保留为NaN
  3. Series.maskstart然后groupby cumsum删除不需要的值
  4. 添加到填充的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM