如何在python上过滤数据透视表

时间:2016-05-21 17:43:14

标签: python pandas dataframe pivot-table

如何过滤透视表以返回特定列。目前我的数据框是这样的:

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

我如何使用指定的行或列过滤我的表。

1 个答案:

答案 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级别是不必要的,因此您可以在调用valuesdf.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)