2017-06-30 135 views
0

我有一個名爲「proficiencies」的熊貓專欄,它是一系列詞典(字符串:浮點映射),我試圖計算每個鍵的平均值。熊貓 - 平均一系列詞典

CURRENT DATA 

{'k': 1, 'w': 1, 't': 0, 'y': 1} 
{'k': 0, 'w': 1, 't': 0, 'y': 1} 


RESULT I WANT 
{'k': 0.5, 'w': 1, 't': 0, 'y': 1}  

我已經簽了幾個答案,似乎GROUPBY,然後使用np.mean聚集正是我需要的。問題是我似乎遇到了groupby的麻煩。

這是我的代碼到目前爲止 - 我想我需要通過詞典鍵進行聚合,然後先做一個np.mean(然後再按長度進行分割)。

df_hypy['proficiencies'].groupby(lambda d: d).aggregate(np.mean) 

但是,這會拋出下面的錯誤。想知道是否有人可以幫忙?

DataError: No numeric types to aggregate 
+1

你將不得不將其寫成長篇。 'pandas'的設計並不是將'dict's作爲值。只需使用for循環。 –

回答

1

您可以使用DataFrame構造與values + tolist轉換列proficienciesnumpy array,然後mean和最後to_dict

df = pd.DataFrame({'proficiencies':[{'k': 1, 'w': 1, 't': 0, 'y': 1}, 
            {'k': 0, 'w': 1, 't': 0, 'y': 1}]}) 
print (df) 
         proficiencies 
0 {'w': 1, 'y': 1, 't': 0, 'k': 1} 
1 {'w': 1, 'y': 1, 't': 0, 'k': 0} 

df = pd.DataFrame(df['proficiencies'].values.tolist()).mean().to_dict() 
print (df) 
{'w': 1.0, 'y': 1.0, 't': 0.0, 'k': 0.5} 

時序

#[2000 rows x 1 columns] 
df = pd.concat([df]*1000).reset_index(drop=True) 
#print (df) 

In [16]: %timeit (pd.DataFrame(df['proficiencies'].values.tolist()).mean().to_dict()) 
100 loops, best of 3: 4 ms per loop 

#Allen solution 
In [17]: %timeit (df.proficiencies.apply(pd.Series).mean().to_dict()) 
1 loop, best of 3: 453 ms per loop 
+0

謝謝,我做到了這一點,它的工作原理! –

+0

很高興能幫到你!祝你好運! – jezrael

0
df=pd.DataFrame({'proficiencies': {0: {'k': 1, 't': 0, 'w': 1, 'y': 1}, 
    1: {'k': 0, 't': 0, 'w': 1, 'y': 1}}}) 

你或許可以這樣做:

df.proficiencies.apply(pd.Series).mean().to_dict() 
Out[8]: {'k': 0.5, 't': 0.0, 'w': 1.0, 'y': 1.0} 
0

如果你真的想做到這一點使用熊貓,和您的列表/數組或字典被稱爲dicts(在你的情況,你有dicts = df_hypy['proficiencies'].values):

dicts = [{'k': 1, 'w': 1, 't': 0, 'y': 1}, {'k': 0, 'w': 1, 't': 0, 'y': 1}] 
pd.DataFrame(dicts).mean().to_dict() 

但是這涉及到創建一個DataFrame對象, h可能會很慢。環路威力更快,這取決於你的數據量:

t = dict() 
for ele in dicts: 
    for key,value in ele.items(): 
     try: 
      t[key].append(value) 
     except KeyError: 
      t[key] = [value] 
{key:np.mean(li) for key,li in t.items()}