2017-06-30 10 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'を値として扱うようには設計されていませんでした。 forループを使うだけです。 –

答えて

1

あなたはmeanその後、values + tolistによってnumpy arrayに列proficienciesを変換するとDataFrameコンストラクタを使用して、最後の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}}}) 

あなたは、おそらくのような何かを行うことができます:あなたは本当にあなたが、あなたのケースで(これ使ってパンダをしたい、とあなたのリスト/配列や辞書がdicts呼び出された場合

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

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

しかし、これはデータフレームオブジェクトを作成する必要が、whic:dicts = df_hypy['proficiencies'].values)を持っています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()} 
関連する問題