2017-09-01 82 views
2

我想要做的事情,我知道必須是基本的熊貓,但我正在絞盡腦汁想出來。我希望每個組的比例和計數可用於分組依據的任意級別:熊貓羣體數量和比例

import pandas as pd 

df = pd.DataFrame({'A': [1, 0, 1, 0, 1, 0, 0, 0], 'B': ['A'] * 4 + ['B'] * 4}) 

gb = df.groupby(['A', 'B']).size() 

prop_gb = gb/gb.groupby(level=0).sum() 

prop_gb現在是:

prop_gb 
Out[116]: 
A B 
0 A 0.400000 
    B 0.600000 
1 A 0.666667 
    B 0.333333 
dtype: float64 

我最終想這一點,雖然:

A B  prop count 
0 A 0.400000  2 
    B 0.600000  3 
1 A 0.666667  2 
    B 0.333333  1 

我試過將兩個pandas.Series對象gbprop_gb合併爲字典並「加入」它們,但我知道必須有一個原生大熊貓的方式來做到這一點...

這在技術上實現了什麼,我想:

desired = {k: (v, prop_gb.to_dict()[k]) for k, v in gb.to_dict().items()} 
desired 
{(0, 'A'): (2, 0.40000000000000002), 
(0, 'B'): (3, 0.59999999999999998), 
(1, 'A'): (2, 0.66666666666666663), 
(1, 'B'): (1, 0.33333333333333331)} 

回答

1

你可以只使用to_frame創建一個數據幀開始與並添加prop列:

>>> desired = df.groupby(['A', 'B']).size().to_frame('count') 
>>> desired['prop'] = gb/gb.groupby(level=0).sum() 
>>> desired 
    count  prop 
A B     
0 A  2 0.400000 
    B  3 0.600000 
1 A  2 0.666667 
    B  1 0.333333 

另類,創建從2系列新的幀:

>>> pd.DataFrame(dict(prop=prop_gb, count=gb)) 
    count  prop 
A B     
0 A  2 0.400000 
    B  3 0.600000 
1 A  2 0.666667 
    B  1 0.333333 
1

的毗連這兩個系列你創建:

df = pd.concat([prop_gb, gb], axis=1) 
df.columns = ['prop', 'count'] 

df 

     prop count 
A B 
0 A 0.400000 2 
    B 0.600000 3 
1 A 0.666667 2 
    B 0.333333 1 
1

你可以做一個表達產生這些值,像這樣:

df.groupby(['A', 'B']).size().agg(
    {'count': lambda x: x, 'prop':lambda x: x/x.sum(level=0)} 
).unstack(level=0).reset_index() 
# A B count  prop 
# 0 0 A 2.0 0.400000 
# 1 0 B 3.0 0.600000 
# 2 1 A 2.0 0.666667 
# 3 1 B 1.0 0.333333