如何将一个行减去一个按数据帧分组的其他行?

问题描述 投票:0回答:1

我已经有了一些'init'值('value''value2')的数据帧,一旦按ID分组,我想将其减去中期值'mid'和最终值'final'

import pandas as pd
df = pd.DataFrame({ 
    'value': [100, 120, 130, 200, 190,210],
    'value2': [2100, 2120, 2130, 2200, 2190,2210],  
     'ID': [1, 1, 1, 2, 2, 2], 
     'state': ['init','mid', 'final', 'init', 'mid', 'final'], 
 })

[我的尝试是通过提取找到'init''mid''final'的索引,并在将'mid'分组后从'final''init'中减去'ID'的值。 :

group = df.groupby('ID')
group['diff_1_f'] = group['value'].iloc[group.index[group['state'] == 'final'] - group['value'].iloc[group.index[dfs['state'] == 'init']]]]
group['diff_2_f'] =  group['value2'].iloc[group.index[group['state'] == 'final'] - group['value'].iloc[group.index[dfs['state'] == 'init']]]
group['diff_1_m'] = group['value'].iloc[group.index[group['state'] == 'mid'] - group['value'].iloc[group.index[dfs['state'] == 'init']]]
group['diff_2_m'] =  group['value2'].iloc[group.index[group['state'] == 'mid'] - group['value'].iloc[group.index[dfs['state'] == 'init']]]  

但是,当然不行。如何获得以下结果:

df = pd.DataFrame({ 
    'diff_value': [20, 30, -10,10],
    'diff_value2': [20, 30, -10,10],  
     'ID': [ 1, 1, 2, 2], 
     'state': ['mid', 'final', 'mid', 'final'], 
 }) 

也采用分组形式。

pandas row pandas-groupby subtraction
1个回答
1
投票

用途:

m = df['state'].ne('int')
df.loc[m, ['value', 'value2']] = df.loc[m, ['value', 'value2']] - df.groupby('ID')['value', 'value2'].transform('first')
print (df)
   diff_value  diff_value2  ID  state
0          20           20   1    mid
1          30           30   1  final
2         -10          -10   2    mid
3          10           10   2  final
© www.soinside.com 2019 - 2024. All rights reserved.