2015-06-02 52 views
4

我有一些三個變量的數據框,我想創建一個字典,每個變量的每個標籤的相對計數。熊貓value_counts()for循環失敗,因爲lambda

我很容易創建一個forloop,輸出正是我想要的,但是我的lambda產生了更奇怪的結果。

下面是數據:

In [3]: 

import pandas as pd 
raw_data = { 
    'category1': ['Red', 'Red', 'Red', 'Green'], 
    'category2': ['Plane', 'Plane', 'Plane', 'Car'], 
    'category3': ['Orange', 'Orange', 'Orange', 'Banana'], 
    } 
df = pd.DataFrame(raw_data) 
df 
Out[3]: 
category1 category2 category3 
0 Red Plane Orange 
1 Red Plane Orange 
2 Red Plane Orange 
3 Green Car Banana 

for循環產生精確的輸出我想:

In [4]: 

forloop = {} 
for column in df: 
    forloop[column] = df[column].value_counts(normalize=True).to_dict() 
forloop 
Out[4]: 
{'category1': {'Green': 0.25, 'Red': 0.75}, 
'category2': {'Car': 0.25, 'Plane': 0.75}, 
'category3': {'Banana': 0.25, 'Orange': 0.75}} 

然而,這拉姆達由於一些未知的原因而失敗:

In [6]: 

ratio = lambda x: x.value_counts(normalize=True).to_dict() 
output_lambda = df.apply(ratio) 
output_lambda 
Out[6]: 
category1 <built-in method values of dict object at 0x10... 
category2 <built-in method values of dict object at 0x10... 
category3 <built-in method values of dict object at 0x10... 
dtype: object 

回答

1

我實際上不明白這裏發生了什麼問題,除了沒有解開dict調用,這裏是一個迂迴的方式來實現你想要的:

In [86]: 
ratio = lambda x: x.value_counts(normalize=True) 
output_lambda = df.apply(lambda x: [x.value_counts().to_dict()]).apply(lambda x: x[0]).to_dict() 
output_lambda 

Out[86]: 
{'category1': {'Green': 1, 'Red': 3}, 
'category2': {'Car': 1, 'Plane': 3}, 
'category3': {'Banana': 1, 'Orange': 3}} 

它看起來像它的綁定函數對象作爲列值,而不是它解壓到一個字典,就是我上面做的是返回value_counts作爲列表,然後再次調用apply來解開單個元素列表。這迫使字典被解壓到一個單一的元素列表在初始apply電話:

In [87]: 
output_lambda = df.apply(lambda x: [x.value_counts().to_dict()]) 
output_lambda 

Out[87]: 
category1  [{'Green': 1, 'Red': 3}] 
category2  [{'Plane': 3, 'Car': 1}] 
category3 [{'Banana': 1, 'Orange': 3}] 
dtype: object 
1

我猜問題是,lambda函數返回不能被大熊貓被tranformed到SeriesDataFrame對象(但應由熊貓專家確認)。

可以實現幾乎相同的事情與你的代碼稍作修改:

ratio = lambda x: x.value_counts(normalize=True) 
output_lambda = df.apply(ratio).to_dict() 

如果你不想在output_lambdanan,你可以使用像這樣的回答提出了一個解決方案: https://stackoverflow.com/a/26033302/4709400