我有一个名为“熟练”的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
答案 0 :(得分:1)
您可以使用DataFrame
构造函数将proficiencies
列转换为numpy array
values
+ tolist
,然后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
答案 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()}