2017-12-12 6 views
1

私はちょっとした問題で少し苦労しています。また、そのための簡単な解決策があることを願っています。私のデータフレームはこのように見えます。パンダのデータフレームは、キーに基づいて行を減らしたり追加したりします

DataFrame: 
8 buy 4 
7 sell 1 
6 buy 1 
5 sell 3 
4 sell 10 
3 buy 100 
2 buy 110 
1 buy 120 

お互いに同じ注文を追加する方法はありますか?だから、DFを次のように変換してください:

DataFrame: 
8 buy 4 
7 sell 1 
6 buy 1 
4 sell 3 + 10 
1 buy 100 + 110 + 120 

私の問題は少し複雑です。私はiterrowsで解決することができると思うが、もっと簡単な解決策があることを望んでいた。

+0

マージと個々のエントリを保つ上の正確な基準は何ですか?あなたはどのように保つことにしますか?最初の2つは行を買いますが、最後の3つはマージしますか? – albert

答えて

3

groupby

df.groupby((df.b!=df.b.shift()).ne(0).cumsum()).agg({'a':'last','c':lambda x : '+'.join(x.astype(str)),'b':'first'}) 
Out[1227]: 
    a   c  b 
b      
1 8   4 buy 
2 7   1 sell 
3 6   1 buy 
4 4   3+10 sell 
5 1 100+110+120 buy 

データ入力とaggを使用する:

df 
Out[1228]: 
    a  b c 
0 8 buy 4 
1 7 sell 1 
2 6 buy 1 
3 5 sell 3 
4 4 sell 10 
5 3 buy 100 
6 2 buy 110 
7 1 buy 120 

さらに詳しい情報:

(df.b!=df.b.shift()).ne(0).cumsum() 
Out[1229]: 
0 1 
1 2 
2 3 
3 4 
4 4 
5 5 
6 5 
7 5 
Name: b, dtype: int32 
+0

それはそのように驚くべきことです!どうもありがとう!それはcumsumと素敵なトリックです! – MichaelRazum

+0

@MichaelRazum yw〜: - )ハッピーコーディング – Wen

0

それは文字列ではなく、実際の合計を探しているかもしれないあなたのように思えます加算の表現。あなたは次のことを持っていると言う:

id_ order px 
0 8 buy 4 
1 7 sell 1 
2 6 buy 1 
3 5 sell 3 
4 4 sell 10 
5 3 buy 100 
6 2 buy 110 
7 1 buy 120 

その場合は、ここであなたが使用できます。

df['order_bin'] = np.where(df.order=='buy', 1, 0) 
df['group'] = (df.order_bin.diff().fillna(0.) != 0.).cumsum() 
df.groupby('group')['px'].sum() 

0  4 
1  1 
2  1 
3  13 
4 330 
関連する問題