2016-11-17 36 views
3

を使用してデータフレームを埋め、私はこのようなものですデータフレームを持っている:パンダ:GROUPBYインデックスと、関数

df = pd.DataFrame({'pop1': ['1000', '2000','3000','4000'], 
        'pop2': ['2000', '3000','2000','2000']}, 
        index=['female','female','male','male']) 

どのように私は与えられた中で、総人口の割合を与える2 * 2のデータフレームを作成することができます特定の性別(2行)の年(2列)?

答えて

4

最初sumによってdivによってsumと除算を集約してgroupby、その後、astypeによりintstringをキャストする必要があります。最終複数100

df = df.astype(int) 

a = df.groupby(level=0).sum() 
print (a) 
     pop1 pop2 
female 3000 5000 
male 7000 4000 

b = df.sum() 
print (b) 
pop1 10000 
pop2  9000 
dtype: int64 

print (a.div(b).mul(100)) 
     pop1  pop2 
female 30.0 55.555556 
male 70.0 44.444444 

それは同じである:ここでは

df = df.astype(int) 
print (df.groupby(level=0).sum().div(df.sum()).mul(100)) 
     pop1  pop2 
female 30.0 55.555556 
male 70.0 44.444444 
+0

ありがとう!私は別の質問があります:女性と男性のすべてが「性別」というインデックス名の下にあり、このインデックスの下に「両方」という別のカテゴリがあり、それによって女性と男性の人口が一緒になります。 groupbyを使用してパーセンテージを計算すると、どのようにしてその両方のカテゴリを無視できますか? –

+0

'df = df.astype(int).drop( 'both')'と 'print(df.groupby(level = 'gender')。sum()/ df.sum()* 100)' – jezrael

+0

ですが、両方のカテゴリがdf.sum()内になければならないかどうかという疑問があります。前のコメントの解決策はそうでない場合。 – jezrael

3

は1つのライナーです:

(df.astype(int)/df.astype(int).sum()).groupby(level=0).sum() * 100 

すでに整数を扱っている場合、それは少しきれいです

df = df.astype(int) 
(df/df.sum()).groupby(level=0).sum() * 100 

P utを単語に変換すると、データを整数に変換した後、それぞれの数値を関連する母集団の合計サイズで除算し、各ジェンダーの重みを合計した後、100を掛けて結果をパーセンテージのように見せます。

+1

あなたのもの:100ループ、最高3:ループあたり1.79ミリ秒 Jezrael's:100ループ、最高3:ループあたり2.25ミリ秒 –

3
v = df.values.astype(int) 
pd.DataFrame(
    v/v.sum(0) * 100, df.index, df.columns 
).groupby(level=0).sum() 

enter image description here

+1

Ahem! OPは初心者です...彼女の@piRSqaredで簡単に行く! ;-) – Kartik