2016-05-02 10 views
0

このようなデータを用いて出発:パンダ:最後の行の値に基づいて、ドロップ列

np.random.seed(314) 
df = pd.DataFrame({ 
     'date':[pd.date_range('2016-04-01', '2016-04-05')[r] for r in np.random.randint(0,5,20)], 
     'cat':['ABCD'[r] for r in np.random.randint(0,4,20)], 
     'count': np.random.randint(0,100,20) 
}) 

    cat count  date 
0 B  84 2016-04-04 
1 A  95 2016-04-05 
2 D  89 2016-04-02 
3 D  39 2016-04-05 
4 A  39 2016-04-01 
5 C  61 2016-04-05 
6 C  58 2016-04-04 
7 B  49 2016-04-03 
8 D  20 2016-04-02 
9 B  54 2016-04-01 
10 B  87 2016-04-01 
11 D  36 2016-04-05 
12 C  13 2016-04-05 
13 A  79 2016-04-04 
14 B  91 2016-04-03 
15 C  83 2016-04-05 
16 C  85 2016-04-05 
17 D  93 2016-04-01 
18 C  32 2016-04-02 
19 B  29 2016-04-03 

次に、Iは、dateによって合計を計算する列にピボットcat、各列の合計を実行して計算する:

summary = df.groupby(['date','cat']).sum().unstack().fillna(0).cumsum() 

cat   A B C D 
date 
2016-04-01 80 235 99 0 
2016-04-02 85 295 153 14 
2016-04-03 111 363 224 14 
2016-04-04 111 379 296 50 
2016-04-05 111 511 296 50 

今私は、最後の列は、いくつかの値未満である列を削除する150結果はのようになりますと言う:

cat   B C 
date 
2016-04-01 235 99 
2016-04-02 295 153 
2016-04-03 363 224 
2016-04-04 379 296 
2016-04-05 511 296 

私はそれの一部を考え出した:

mask = summary[-1:].squeeze() > 150 


     cat 
count A  False 
     B  True 
     C  True 
     D  False 

は私に列をドロップするためのマスクを与えます。私が理解できないことは、summary.drop(...)への呼び出しでそれを使用する方法です。何かヒント?

+0

私は異なった値を持っています。あなたは種を生成した直後にそれらを手に入れましたか? – Alexander

+0

これは、あなたが望むフィルターを返しますか? 'mask.index.get_level_values(1)[mask]'? – EdChum

答えて

2

代わりにあなたがしたくない列をドロップする、あなたも(ブールインデックスとマスクを使用して)あなたが欲しいものを選択することができます。

In [16]: mask = summary[-1:].squeeze() > 220 

In [17]: summary.loc[:, mask] 
Out[17]: 
      count 
cat    B  D 
date 
2016-04-01 141.0 94.0 
2016-04-02 235.0 94.0 
2016-04-03 235.0 144.0 
2016-04-04 326.0 144.0 
2016-04-05 384.0 229.0 

(私はそうでないすべての列があったが、220の代わりに150を使用ちょうど代わりusinの)位置によって、最後の行(選択

mask = summary.iloc[-1] > 220 

また、マスクを計算するためのより良い方法は、おそらく以下である)選択gスクイーズ。

関連する問題