2016-10-23 19 views
0

問題我々はサンプルを持って

Pythonの:パンダ:列ごとに割合

コンテキスト
"合計/合計df.pivot_table(margins=True)によって提供される%とpd.pivot_tableする方法(割合)欄"ピボット:このように

import pandas as pd 
import numpy as np 

df = pd.DataFrame([["row1",50, 200],["row2",100, 300]], columns=list('ABC')) 

print(df) 
print("\n\n") 
pivot = df.pivot_table(
    index=["A"], 
    columns=[], 
    values=["B", "C"], 
    aggfunc={ 
     "B": np.sum, 
     "C": np.sum, 
    }, 
    margins=True, 
    margins_name = "Total", 
    fill_value=0 

) 

print(pivot) 

 B C 
A    
row1 50 200 
row2 100 300 
Total 150 500 


すなわち

 B C D  E 
A    
row1 50 200 250 38.46% 
row2 100 300 400 61.54% 
Total 150 500 650 100% 

所望の出力は、我々は基本的に、列の合計の割合ですpivot_tableの出力に列E (pct of row & column total)を追加したいです。

例を少し読みやすくするために、'D'という列を追加しましたが、これは実際の出力の一部であってはなりません。

それ以外にも、出力形式はこのようにとどまる必要があります。最終的には、ビジネス用のExcelシートに出力します。我々は、印刷時にそのまま滞在する列を必要とするよう


を考え出したていないどのそのまま滞在する出力形式を必要として私のために動作しませんでした さらに、私はパンダが最新のバージョンでこの周りにきちんとした方法を見つけたので、df.pivot_table。彼らは通常、繰り返しのいくつかの便利な改善を追加します。 :)

仕様
のPython:3.5.2
パンダ:0.18.1
numpyの:1.11。あなたはこのような何か行うことができます1

答えて

0

:。

df = pd.DataFrame([["row1",50, 200],["row2",100, 300]], columns=list('ABC')) 
df = df.set_index('A') 
df['E'] = df.apply(lambda x: x/df.sum().sum()).sum(axis=1) 
df.loc['Total'] = df.sum() 
In[52]: df 
Out[52]: 
      B  C   E 
A        
row1 50.0 200.0 0.384615 
row2 100.0 300.0 0.615385 
Total 150.0 500.0 1.000000 

df.apply(lambda x: x/df.sum().sum()) 

は、すべての要素の和であるdf.sum()合計()で各要素をdvided。

.sum(axis=1) 

合計

df.loc['Total'] 

はあなたがスティーブン・Gのアプローチに触発さ

0

を好きに新しい行を移入することができ、すべての行は、このソリューションは、私の仕事:

import pandas as pd 
import numpy as np 

df = pd.DataFrame([["row1",50, 200],["row2",100, 300]], columns=list('ABC')) 


#print(df) 
print("\n\n") 
pivot = df.pivot_table(
    index=["A"], 
    columns=[], 
    values=["B", "C"], 
    aggfunc={ 
     "B": np.sum, 
     "C": np.sum, 

    }, 
    margins=True, 
    margins_name = "Total", 
    fill_value=0 

) 
print(pivot) 

a = pd.DataFrame(pivot.ix["Total"]).transpose()["B"].values 

pivot["E"] = pivot["B"].apply(lambda x: round(x/float(a), 2)) 

print(pivot) 


OUTPUT

  B  C  E 
A       
row1 50.0 200.0 0.33 
row2 100.0 300.0 0.67 
Total 150.0 500.0 1.00 
関連する問題