2016-04-24 13 views
2

私はパンダのデータフレーム、dfを持っています。そこからピボットテーブルが次の関数を使って生成されます。パンダ、ピボットテーブルの階層を避ける

def objective2(excel_file): 
    df = pd.read_excel(excel_file) 

    # WBC cut-offs 
    df['WBC_groups'] = pd.cut(df.WBC, [0, 4, 12, 100], 
          labels=['WBC < 4', 'WBC Normal', 'WBC > 12']) 

    df['count'] = 1 

    table = df.pivot_table('count', index=['Sex'], 
          columns=['WBC_groups', 'Outcome_at_24'], 
          aggfunc='sum', 
          margins=True, margins_name='Total') 

    return table 

これは、次の表を生成します。

WBC_groups   WBC < 4  WBC Normal  WBC > 12  Total 
Outcome_at_24 Alive Died  Alive Died Alive Died  
Sex                
Female   10.0 2.0  20.0 6.0  14.0 NaN  86.0 
Male    3.0 NaN  28.0 3.0  26.0 4.0  111.0 
Total   13.0 2.0  48.0 9.0  40.0 4.0  197.0 

表は次のようになりますように、私は列の階層を回避することができます方法:

WBC_groups  WBC < 4 WBC Normal WBC > 12 Alive Died Total  
Sex                
Female   10.0   2.0  20.0  6.0  14.0 86.0 
Male    3.0   NaN  28.0  3.0  26.0 111.0 
Total   13.0   2.0  48.0  9.0  40.0 197.0 

注:データテーブルは正確ではなく、ただのダミーです。

+0

は、出力が正しいですか?列 '(WBC> 12)、死んだ'ドロップですか? – jezrael

+0

@ jezraelの場合、出力は正しいですが、合計の列はデータセット全体を取ります。したがって、データセットごとに正しいです。 NaNの値はゼロです。 – Amani

答えて

2

pivot_tableでは、2列のパラメータ列(WBC_groupsOutcome_at_24)を使用しているため、階層を回避できないと思います。

最も簡単な解決策は、新しい列の名前を設定し、その後droprem

df.columns = ['WBC < 4', 'WBC Normal', 'WBC > 12', 'Alive', 'Died', 'rem', 'Total'] 
df = df.drop('rem', axis=1) 
print df 
     WBC < 4 WBC Normal WBC > 12 Alive Died Total 
Sex              
Female  10.0   2.0  20.0 6.0 14.0 86.0 
Male  3.0   NaN  28.0 3.0 26.0 111.0 
Total  13.0   2.0  48.0 9.0 40.0 197.0 

しかし、あなたは、より一般的なソリューションを必要とします。

print df 
WBC_groups WBC < 4  WBC Normal  WBC > 12  Total 
Outcome_at_24 Alive Died  Alive Died Alive Died  
Sex                
Female   10.0 2.0  20.0 6.0  14.0 NaN 86.0 
Male    3.0 NaN  28.0 3.0  26.0 4.0 111.0 
Total   13.0 2.0  48.0 9.0  40.0 4.0 197.0 

cols1 = df.columns.get_level_values('WBC_groups').to_series().drop_duplicates().tolist() 
print cols1 
['WBC < 4', 'WBC Normal', 'WBC > 12', 'Total'] 

cols2 = df.columns.get_level_values('Outcome_at_24').to_series().drop_duplicates().tolist() 
print cols2 
['Alive', 'Died', ' '] 

cols = cols1[:-1] + cols2[:2] + ['rem'] + cols1[-1:] 
print cols 
['WBC < 4', 'WBC Normal', 'WBC > 12', 'Alive', 'Died', 'rem', 'Total'] 

df.columns = cols 

df = df.drop('rem', axis=1) 
print df 
     WBC < 4 WBC Normal WBC > 12 Alive Died Total 
Sex              
Female  10.0   2.0  20.0 6.0 14.0 86.0 
Male  3.0   NaN  28.0 3.0 26.0 111.0 
Total  13.0   2.0  48.0 9.0 40.0 197.0 
+0

私はより明確にするために私の質問を編集しました。 – Amani

+0

さて、私は私の解決策の上でそれを説明しようとします。私は不可能だと思う。 – jezrael

+0

ありがとうございます。 – Amani