減算

2017-07-19 12 views
1

I、次のデータフレームを有する:減算

 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要素の減算を行いたいとこのような期待される結果は、あろうこと:followiと

values1 = group.loc[group['AID'] == 1]["START"] 
values2 = group.loc[group['AID'] == 2]["START"] 

-11136 - (-11137) = 1 

-11121 - (-11114) =-7 

-11034 - (-11032) =-2 

Nan - (-11002) = NaN 

だから私は2つのグループを抽出しました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)、私は正しい答えを得る。 AIDグループを「ミックス」するときだけ、NaNが得られます。私はちょうどパンダスを使い始めていますが、私は明らかに何かをここで欠いています。なにか提案を?

+0

try: values1.values - values2.values –

+0

あなたが欠けているのは、Pandasが本質的なデータ整列を行うことです。パンダが両方のデータフレームのインデックスに基づいて減算されることを意味します。行インデックスが整列していないため、数値からNaNまたはNaNを引いた数からNaNを引いた数が得られます。 –

+0

期待される出力は? –

答えて

1

pandasはラベルに基づいた操作を行います。ラベル((71,74,78)と(79,83,86))が一致しないため、減算する値は見つかりません。

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

ありがとう! 「values1」に「values2」よりも多くの値がある場合はどうなりますか?ナンシーはそれが好きではないようです。 – user2920100

2

だが、これを試してみましょう:なし関連するラベルが存在しないので、これに対処する一つの方法は、シリーズの代わりにnumpyの配列を使用することです奇妙なことにそれについて行く

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

@ user2920100新しい出力で更新されました。 –

0

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