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.
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
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