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

标签 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

我如何能够使用指定的行或列来过滤我的表格。

最佳答案

看起来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'])

要访问的列,您需要为MultiIndex的每个级别指定一个值:

In [179]: list(table.columns)
Out[179]: [('sum', 'Female'), ('sum', 'Male'), ('sum', 'All')]

因此,要选择男性列,您可以使用

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

由于 sum 级别是不必要的,因此您可以通过在调用 df.pivot 时指定 values 参数来摆脱它>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)

关于python - 如何在Python上过滤数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37366208/

相关文章:

python - 当我传递 skip_footer arg 时,Pandas read_csv 忽略列数据类型

python - 在python的数据框中找不到该项目

python - 比较数据框中的列并将其放入另一个数据框中

r - 从该数据帧中的每个记录时间戳计算一秒窗口中出现多少数据帧记录时间戳的优化

python - 是否有可能从 python/pandas 并行写入 Parquet?

python - 加速将函数作为 numba 参数的函数

Python 装饰器 : howto list wrapped functions by decorator

python - 使用 sum 函数时不支持的操作数类型

python - 数据帧上的 Dask 方法返回应用方法结果的字典

python - 这个 Python Turtle 图形是如何制作的?