2016-05-02 11 views
0

Ausgehend von Daten wie diese fallen:pandas: Spalten basierend auf dem Wert in letzter Reihe

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 

nächste I berechnen Summen von date, Pivot cat in Spalten und laufende Summen für jede Spalte berechnet werden:

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 

Jetzt möchte ich Spalten entfernen, wo die letzte Spalte kleiner als ein Wert ist, sagen 150. das Ergebnis sollte wie folgt aussehen:

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 

Ich habe einen Teil davon herausgefunden:

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


     cat 
count A  False 
     B  True 
     C  True 
     D  False 

gibt mir eine Maske Spalt fallen. Was ich nicht herausfinden kann ist, wie man es mit einem Anruf an summary.drop(...) verwendet. Irgendwelche Hinweise?

+0

Ich habe verschiedene Werte. Hast du diese sofort nach dem Erzeugen des Samens bekommen? – Alexander

+0

Gibt dies den gewünschten Filter zurück: 'mask.index.get_level_values ​​(1) [mask]'? – EdChum

Antwort

2

Statt die Spalten fallen Sie nicht wollen, können Sie auch die, die wählen Sie (unter Verwendung der Maske mit boolean Indizierung) wollen:

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 

(I 220 anstelle von 150 verwendet, sonst alle Spalten waren ausgewählt)

Ferner ist eine bessere Möglichkeit, die Maske zu berechnen, ist vermutlich der folgende: statt usin

mask = summary.iloc[-1] > 220 

die die letzte Zeile auswählt einfach (durch Position) g drücken.

Verwandte Themen