熊猫 - 平均一系列词典

时间:2017-06-30 02:44:26

标签: python pandas

我有一个名为“熟练”的pandas专栏,它是一系列字典(字符串:浮点映射),我正在尝试计算每个键的平均值。

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

3 个答案:

答案 0 :(得分:1)

您可以使用DataFrame构造函数将proficiencies列转换为numpy array values + tolist,然后meanto_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

答案 1 :(得分: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}

答案 2 :(得分:0)

如果您真的想使用pandas执行此操作,并且您的列表/数组或词典被称为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对象,这可能很慢。循环可能更快,具体取决于您拥有的数据量:

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()}