基于条件的pandas中的差异行

时间:2016-10-29 01:56:19

标签: python pandas

我有这个人。数据帧:

region     country  Season  stage   statistic   value   ps     ps_vals
alabama      usa    2000    1        median     135.53  0       46.153846
alabama      usa    2001    1        median     138.75  0       30.769231
alabama      usa    2000    3        median     151     91.11    0
alabama      usa    2001    3        median     148.125 46.666  8.333333
california   usa    2000    1        median     83.7191 3.2258  100
california   usa    2001    1        median     92.6332 6.4516  91.666667
california   usa    2000    3        median     49.2137 0       66.666667
california   usa    2001    3        median     108.029 58.0645 58.333333

我想创建一个新的数据框,其中包含ps_vals之间的差异,其中L.H.S是stage 3的值,而R.H.D是stage 1的值。对于阿拉巴马州,2000年ps_vals 3的stage值为0,而2000年的stage为46.153846,因此差异。将是-46.153846

结果数据框应如下所示:

region     country  Season  ps_vals
alabama      usa    2000    -46.153846
alabama      usa    2001    -22.435898
california   usa    2000    -33.333333
california   usa    2001    -33.333334

如何实现这一目标?我可以区分这样的连续行:df['dA'] = df['A'] - df['A'].shift(-1),但在这种情况下这不起作用,因为行可能不是连续的。

1 个答案:

答案 0 :(得分:1)

自动将仅使用阶段1过滤的数据帧与阶段3值合并。然后计算现在对齐的ps_vals数据之间的差异:

results = df[df.stage==1].merge(df[df.stage==3],
                                on=['region', 'country', 'Season'],
                                suffixes = ('_x', ''))

results.ps_vals -= results.ps_vals_x

results[['region', 'country', 'Season', 'ps_vals']]
Out[56]: 
       region country  Season    ps_vals
0     alabama     usa    2000 -46.153846
1     alabama     usa    2001 -22.435898
2  california     usa    2000 -33.333333
3  california     usa    2001 -33.333334