2017-07-19 54 views
1

我有以下的数据帧:减法的从数据帧的不同部分两个系列

 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"] 

与followi NG结果:

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),我得到了正确的答案。只有当我“混合”援助组时,我才能得到NaN。我刚刚开始使用熊猫,但我显然在这里失去了一些东西。任何建议?

+0

尝试: values1.values - values2.values –

+0

你缺少的是熊猫做内在的数据对齐。这意味着熊猫将根据两个数据帧的索引进行相减。由于行索引不对齐,所以您将得到一个数字减NaN或NaN减一个数字,那些相等的NaN。 –

+0

您的预期产出是什么? –

回答

1

熊猫做基于标签的操作。由于您的标签((71,74,78)和(79,83,86))不匹配,因此找不到任何要扣除的值。要解决这个问题的方法之一是使用numpy的阵列,而不是一个系列的,所以没有相关的标签:

values1 - values2.values 
Out: 
71 1 
74 -7 
78 -2 
Name: START, dtype: int64 
+0

谢谢!如果“values1”中的值比“values2”中的值多? Numpy似乎不喜欢那样。 – user2920100

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 
+0

@ user2920100以新输出更新。 –

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 
相关问题