我已经有了一些'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'],
})
也采用分组形式。
用途:
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