2016-07-22 131 views
4

我有一個數據幀如下:通過計算並計算大熊貓的比例?

d = { 
    'id': [1, 2, 3, 4, 5], 
    'is_overdue': [True, False, True, True, False], 
    'org': ['A81001', 'A81002', 'A81001', 'A81002', 'A81003'] 
} 
df = pd.DataFrame(data=d) 

現在我想工作的每個組織,有多大比例的行逾期,以及多大比例都沒有。

我知道如何通過組的組織和逾期貸款:

df.groupby(['org', 'is_overdue']).agg('count') 

但是我怎麼通過組織的比例是多少?我想這樣的事情結束了:

org  is_overdue not_overdue proportion_overdue 
A81001 2   0    100 
A81002 1   1    50 
A81003 0   1    0 

回答

5

你可以使用DataFrame.apply

第一組由組織統計逾期/未逾期的人數。然後計算百分比。

df_overdue = df.groupby(['org']).apply(lambda dft: pd.Series({'is_overdue': dft.is_overdue.sum(), 'not_overdue': (~dft.is_overdue).sum()})) 
df_overdue['proportion_overdue'] = df_overdue['is_overdue']/(df_overdue['not_overdue'] + df_overdue['is_overdue']) 

print(df_overdue) 

輸出

 is_overdue not_overdue proportion_overdue 
org             
A81001   2   0     1.0 
A81002   1   1     0.5 
A81003   0   1     0.0 
+0

令人驚歎,謝謝!我只是試圖弄清楚它究竟做了什麼:它看起來像它爲每個組分配兩個新系列,使用lambda表達式計算? – Richard

4

你可以使用pd.crosstab創建一個頻率表 - 即來算的is_overdue S表示每個org數。

import pandas as pd 
d = { 
    'id': [1, 2, 3, 4, 5], 
    'is_overdue': [True, False, True, True, False], 
    'org': ['A81001', 'A81002', 'A81001', 'A81002', 'A81003'] 
} 
df = pd.DataFrame(data=d) 

result = pd.crosstab(index=df['org'], columns=df['is_overdue'], margins=True) 
result = result.rename(columns={True:'is_overdue', False:'not overdue'}) 
result['proportion'] = result['is_overdue']/result['All']*100 
print(result) 

產生

is_overdue not overdue is_overdue All proportion 
org             
A81001    0   2 2  100.0 
A81002    1   1 2  50.0 
A81003    1   0 1   0.0 
All     2   3 5  60.0 
+0

我真的很喜歡這個答案 - 我以前從來沒有見過'crosstab'。感謝您向我介紹新的東西! – Alex

2

有更有效的方法可以做到這一點,但因爲你試圖開始使用聚合函數,這是用聚合函數來解決問題的方式:

df.is_overdue = df.is_overdue.map({True: 1, False: 0}) 
df.groupby(['org'])['is_overdue'].agg({'total_count':'count', 'is_overdue': 'sum'}).reset_index() 

現在,您可以非常輕鬆地計算not_overdue和proportion_overdue。