从数据帧的不同部分减去两个系列

时间:2017-07-19 21:35:29

标签: python pandas

我有以下数据框:

        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组。我刚刚开始使用熊猫,但我在这里显然遗漏了一些东西。有什么建议吗?

3 个答案:

答案 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