2016-10-14 11 views
2

を動作しない合計しますヒントデータベースを使用して、各性別/喫煙者について、女性喫煙者/女性全員と女性非喫煙者/全女性の合計請求額の割合を確認したい(男性の場合も同じ)パンダのグループ化 - グループ化の割合などの値は、私はそれぞれの値は、カテゴリ「でグループ」の総計の割合</p> <p>ようであるかを把握しようとしています、データフレームとパンダを使用して

例えば

完全なデータセットの場合:

Sex, Smoker, Day, Time, Size, Total Bill 
Female,No,Sun,Dinner,2, 20 
Female,No,Mon,Dinner,2, 40 
Female,No,Wed,Dinner,1, 10 
Female,Yes,Wed,Dinner,1, 15 

最初の行の値は、(20 + 40 + 10)/(20 + 40 + 10 + 15)になり、それらは、非喫煙女性

ための他の3つの値であるように出力がはず以下のような

Female No 0.823529412 
Female Yes 0.176470588 

しかし、私は私が

import pandas as pd 
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata- book/master/ch08/tips.csv", sep=',') 
df.groupby(['sex', 'smoker'])[['total_bill']].apply(lambda x: x/x.sum()).head() 

、私はこれを行うと、いくつかのトラブル

を持っているように見えます以下を得る:

total_bill 
0 0.017378 
1 0.005386 
2 0.010944 
3 0.
4 0.025151 
それは

を返します。私はもっと

df.groupby(['sex', 'smoker'])[['total_bill']].sum() 

ような何かを探しています各品目

のためにそれを計算するだけでグループを無視しているように見える

 total_bill 
sex smoker 
Female No 977.68 
     Yes 593.27 
Male No 1919.75 
     Yes 1337.07 

しかし、これは個人の合計に対する合計の割合として表したがります性的な/喫煙者の組み合わせまたは

Female No 977.68/(977.68+593.27) 
Female Yes 593.27/(977.68+593.27) 
Male No 1919.75/(1919.75+1337.07) 
Male Yes 1337.07/(1919.75+1337.07) 

私は理想的には同じことを "tip"列で同時に行いたいと思います。

私は間違っていると私はこれをどのように修正しますか?ありがとうございました!

答えて

6

あなたは割合の計算にsumテーブルを取得した後、あなたが別のプロセスによってグループ化を追加することができます

(df.groupby(['sex', 'smoker'])['total_bill'].sum() 
    .groupby(level = 0).transform(lambda x: x/x.sum())) # group by sex and calculate percentage 

#sex  smoker 
#Female No  0.622350 
#  Yes  0.377650 
#Male No  0.589455 
#  Yes  0.410545 
#dtype: float64 
+1

(df.groupby([ 'セックス'、 '喫煙を'])[ 'total_bill'、 '先端'] .sum() .groupby(レベル= 0).transform(ラムダx:x/x.sum()))これは同時にチップを計算する方法のようです...ありがとうございます! –

+0

次の質問http://stackoverflow.com/questions/40049347/pandas-grouping-values-as-percent-of-grouped-totals-based-on-another-columnを見るのに十分親切でしょうか。ありがとう –

関連する問題