2016-05-21 7 views
0

Wie filtere ich Pivot-Tabellen, um bestimmte Spalten zurückzugeben. Derzeit ist mein Datenrahmen das:Pivot-Tabellen auf Python filtern

print table 
        sum    
Sex    Female Male All 
Date (Intervals)     
April    166 191 357 
August    212 263 475 
December   173 263 436 
February   192 298 490 
January    148 195 343 
July    189 260 449 
June    165 238 403 
March    165 278 443 
May     236 253 489 
November   167 247 414 
October    185 287 472 
September   175 306 481 
All    2173 3079 5252 

Ich möchte Ergebnisse nur der männlichen Spalte anzeigen. Ich habe versucht, den folgenden Code:

table.query('Sex == "Male"') 

Jedoch habe ich diesen Fehler

TypeError: Expected tuple, got str 

Wie würde ich in der Lage sein, meine Tabellenspalten mit bestimmten Zeilen oder zu filtern.

Antwort

1

Es sieht aus wie table eine Spalte hat MultiIndex:

    sum    
Sex    Female Male All 

Eine Möglichkeit, zu überprüfen, ob Ihre table eine Spalte hat Multiindex ist table.columns zu inspizieren:

In [178]: table.columns 
Out[178]: 
MultiIndex(levels=[['sum'], ['All', 'Female', 'Male']], 
      labels=[[0, 0, 0], [1, 2, 0]], 
      names=[None, 'sex']) 

Um eine Spalte von table zugreifen Sie müssen für jede Ebene des MultiIndex einen Wert angeben:

So wählen die Male Spalte, würden Sie

In [176]: table[('sum', 'Male')] 
Out[176]: 
date 
April   42.0 
August  34.0 
December  32.0 
... 

verwenden Da die sum Ebene nicht erforderlich ist, können Sie davon bekommen konnte befreien, indem Sie den values Parameter angeben, wenn df.pivot oder df.pivot_table aufrufen.

table2 = df.pivot_table(index='date', columns='sex', aggfunc='sum', margins=True, 
         values='sum') 
# sex  Female Male  All 
# date        
# April  40.0 40.0 80.0 
# August  48.0 32.0 80.0 
# December  48.0 44.0 92.0 

Zum Beispiel

import numpy as np 
import pandas as pd 
import calendar 
np.random.seed(2016) 
N = 1000 
sex = np.random.choice(['Male', 'Female'], size=N) 
date = np.random.choice(calendar.month_name[1:13], size=N) 
df = pd.DataFrame({'sex':sex, 'date':date, 'sum':1}) 

# This reproduces a table similar to yours 
table = df.pivot_table(index='date', columns='sex', aggfunc='sum', margins=True) 
print(table[('sum', 'Male')]) 

# table2 has a single level Index 
table2 = df.pivot_table(index='date', columns='sex', aggfunc='sum', margins=True, 
         values='sum') 
print(table2['Male']) 

Ein anderer Weg, um die sum Ebene zu entfernen wäre table = table['sum'], oder table.columns = table.columns.droplevel(0) zu verwenden.

+0

Danke! Genau nach was ich suche. Jedoch nach dem Loswerden der Summe Level Im noch erhalten und Fehler beim Ausführen von 'table.query ('Sex ==" Male "')'. Es kommt mit 'pandas.core.indexing.IndexingError: Unalignable boolescher Serienschlüssel zur Verfügung gestellt'. Was wäre der Grund dafür? – Kyuu

+0

Der Query-String ''Sex ==" Male "' wird ausgewertet (in 'table.query') als boolesche Reihe,' res', was 'True' ist, wobei der Spaltenname' 'Male'' entspricht - also so gut. Dann verwendet 'table.query' die boolesche Reihe' res', um 'table' [mit' table.loc [res] 'zu indizieren oder, falls das fehlschlägt,' table [res] '] (https: // github .com/pydata/pandas/blob/master/pandas/kern/frame.py # L2150). Beides funktioniert nicht, da diese versuchen, 'res' zu verwenden, um * Zeilen * der Tabelle auszuwählen, nicht * Spalten *. Um die 'Male'-Spalte auszuwählen, verwenden Sie' table [('sum', 'Male')] 'oder' table2 ['Male'] '. – unutbu