2016-05-21 32 views
0

特定の列を返すようにピボットテーブルをフィルタリングする方法を教えてください。現在、私のデータフレームはこれです:Pythonでピボットテーブルをフィルタリングする方法

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 

私は男性のみの列の結果を表示したいです。私はこのエラーに

TypeError: Expected tuple, got str 

どのように私は指定された行や列と私のテーブルをフィルタリングすることができるだろうだが

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

:私は、次のコードを試してみました。

答えて

1

tableが列MultiIndex持っているように見えます:

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

あなたtableの列にアクセスするには:あなたのtableはマルチインデックスがtable.columnsを検査することで、列を持っているかどうかを確認するために

    sum    
Sex    Female Male All 

1つの方法MultiIndexの各レベルの値を指定する必要があります。

したがって、

Male列を選択するには、sumレベルが不要ですので、あなたが

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

を使用することになり、あなたはdf.pivotdf.pivot_tableを呼び出すときvaluesパラメータを指定することによって、それを取り除くことができます。例えば

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 

sumレベルを除去する

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']) 

別の方法はtable = table['sum']、 又はtable.columns = table.columns.droplevel(0)を使用することであろう。

+0

ありがとうございました!正確に何を探しています。しかし、合計レベルを取り除いた後でも、 'table.query( 'Sex ==" Male "')'を実行しても、まだ受け取ったりエラーになったりします。 'pandas.core.indexing.IndexingError:Unalignable boolean Series key provided'が出てきます。これの原因は何ですか? – Kyuu

+0

クエリ文字列 '' Sex == "Male"は、 '' Male "'とマッチする 'True'のブール値の系列、' 'res''として(' 'table.query'の中で)評価されますとても良い。しかし、 'table.query'はブール値のシリーズ' res'を使って 'table'を' table.loc [res] 'で索引付けします。失敗した場合は' table [res] '](https:// github .com/pydata/pandas/blob/master/pandas/core/frame.py#L2150)。これらはどちらも 'res'を使って* columns *ではなくtableの* rows *を選択しようとするので失敗します。 'Male'カラムを選択するには' table [( 'sum'、 'Male')] 'または' table2 ['Male'] 'を使います。 – unutbu