如何过滤透视表以返回特定列。目前我的数据框是这样的:
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
我想只显示男性栏目的结果。我尝试了以下代码:
table.query('Sex == "Male"')
但是我收到了这个错误
TypeError: Expected tuple, got str
我如何使用指定的行或列过滤我的表。
答案 0 :(得分:4)
看起来table
有一列MultiIndex:
sum
Sex Female Male All
检查table
是否有列MultiIndex的一种方法是检查table.columns
:
In [178]: table.columns
Out[178]:
MultiIndex(levels=[['sum'], ['All', 'Female', 'Male']],
labels=[[0, 0, 0], [1, 2, 0]],
names=[None, 'sex'])
要访问table
列,您需要为MultiIndex的每个级别指定一个值:
In [179]: list(table.columns)
Out[179]: [('sum', 'Female'), ('sum', 'Male'), ('sum', 'All')]
因此,要选择Male
列,您可以使用
In [176]: table[('sum', 'Male')]
Out[176]:
date
April 42.0
August 34.0
December 32.0
...
由于sum
级别是不必要的,因此您可以在调用values
或df.pivot
时指定df.pivot_table
参数来摆脱它。
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
例如,
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'])
删除sum
级别的另一种方法是使用table = table['sum']
,
或table.columns = table.columns.droplevel(0)
。