2017-10-20 15 views
2

私はorders_dfを持っている:特定の値が発生する行を取得するにはどうすればよいですか?

 Symbol Order Shares 
Date       
2011-01-10 AAPL BUY 1500 
2011-01-13 AAPL SELL 1500 
2011-01-13 IBM BUY 4000 
2011-01-26 GOOG BUY 1000 
2011-02-02 XOM SELL 4000 
2011-02-10 XOM BUY 4000 
2011-03-03 GOOG SELL 1000 
2011-03-03 IBM SELL 2200 
2011-05-03 IBM BUY 1500 
2011-06-03 IBM SELL 3300 
2011-08-01 GOOG BUY  55 
2011-08-01 GOOG SELL  55 

私はその日にSELLSの数にDateをマップする変数を持って欲しいです。 BUYの対称変数も必要です。

私は

num_orders_per_day = orders_df.groupby(['Date']).size() 

を行うことによって、すべてのOrdersのためにそれをやってみましたし、得た:

Date 
2011-01-10 1 
2011-01-13 2 
2011-01-26 1 
2011-02-02 1 
2011-02-10 1 
2011-03-03 2 
2011-05-03 1 
2011-06-03 1 
2011-08-01 2 

が、それは所望の出力ではありません。私が欲しいもの

sells_on_a_dayです:その後、

2011-01-13 1 
2011-02-02 1 
2011-03-03 2 
2011-06-03 1 
2011-08-01 1 

と同様のbuys_on_a_day変数。その後、boolean indexingとすることにより

答えて

3

まずフィルタはcountを得る:

num_sells_per_day = orders_df[orders_df['Order'] == 'SELL'] 
         .groupby(level=0).size().reset_index(name='count') 
print (num_sells_per_day) 
     Date count 
0 2011-01-13  1 
1 2011-02-02  1 
2 2011-03-03  2 
3 2011-06-03  1 
4 2011-08-01  1 

オルタナティブ:

num_sells_per_day = orders_df.query("Order == 'SELL'") 
          .groupby(level=0) 
          .size() 
          .reset_index(name='count') 
print (num_sells_per_day) 
     Date count 
0 2011-01-13  1 
1 2011-02-02  1 
2 2011-03-03  2 
3 2011-06-03  1 
4 2011-08-01  1 

また、一部の値が欠落している場合にのみNaN秒を取得し、一緒に2列を作成することも可能である。

df1 = orders_df.groupby(['Date','Order']).size().unstack() 
print (df1) 
Order  BUY SELL 
Date     
2011-01-10 1.0 NaN 
2011-01-13 1.0 1.0 
2011-01-26 1.0 NaN 
2011-02-02 NaN 1.0 
2011-02-10 1.0 NaN 
2011-03-03 NaN 2.0 
2011-05-03 1.0 NaN 
2011-06-03 NaN 1.0 
2011-08-01 1.0 1.0 
+0

わかりやすくするために名前を 'num_sells_per_day'に変更しますそれは動作します。 – dirtysocks45

関連する問題