我有以下数据框:
SID AID START END
71 1 1 -11136 -11122
74 1 1 -11121 -11109
78 1 1 -11034 -11014
79 1 2 -11137 -11152
83 1 2 -11114 -11127
86 1 2 -11032 -11038
88 1 2 -11121 -11002
我想按顺序减去AID == 1和AID == 2的START元素,以便预期结果为:
-11136 - (-11137) = 1
-11121 - (-11114) =-7
-11034 - (-11032) =-2
Nan - (-11002) = NaN
所以我提取了两组:
values1 = group.loc[group['AID'] == 1]["START"]
values2 = group.loc[group['AID'] == 2]["START"]
具有以下结果:
71 -11136
74 -11121
78 -11034
Name: START, dtype: int64
79 -11137
83 -11114
86 -11032
88 -11002
Name: START, dtype: int64
做了一个简单的减法:
values1-values2
但我得到了所有NaN:
71 NaN
74 NaN
78 NaN
79 NaN
83 NaN
86 NaN
我注意到如果我使用来自同一AID组的数据(例如START-END),我会得到正确答案。只有当我"混合" AID组。我刚刚开始使用熊猫,但我在这里显然遗漏了一些东西。有什么建议吗?
答案 0 :(得分:2)
让我们试试这个:
df.set_index([df.groupby(['SID','AID']).cumcount(),'AID'])['START'].unstack().add_prefix('col_').eval('col_1 - col_2')
输出:
0 1.0
1 -7.0
2 -2.0
3 NaN
dtype: float64
答案 1 :(得分:1)
pandas根据标签执行这些操作。由于您的标签((71,74,78)和(79,83,86))不匹配,因此找不到任何要减去的值。解决这个问题的一种方法是使用numpy数组而不是Series,因此没有关联的标签:
values1 - values2.values
Out:
71 1
74 -7
78 -2
Name: START, dtype: int64
答案 2 :(得分:0)
奇怪的方式去做吧
-np.diff([g.reset_index(drop=True) for n, g in df.groupby('AID').START])[0]
0 1.0
1 -7.0
2 -2.0
3 NaN
Name: START, dtype: float64