我有一个DataFrame
df = pd.DataFrame({'keywords': [{'a': 3, 'b': 4, 'c': 5}, {'c':1, 'd':2}, {'a':5, 'c':21, 'd':4}, {'b':2, 'c':1, 'g':1, 'h':1, 'i':1}]})
我想在不使用iterrows
的情况下将所有元素添加到所有行中,以得到结果:
a: 8
b: 6
c: 28
d: 6
g: 1
h: 1
i: 1
注意:在原始DataFrame的单行中,没有任何元素出现两次。
答案 0 :(得分:1)
使用collections.Counter
,可以sum
个Counter
对象的迭代对象。由于Counter
是dict
的子类,因此您可以输入pd.DataFrame.from_dict
。
from collections import Counter
counts = sum(map(Counter, df['keywords']), Counter())
res = pd.DataFrame.from_dict(counts, orient='index')
print(res)
0
a 8
b 6
c 28
d 6
g 1
h 1
i 1
答案 1 :(得分:1)
不确定在优化方面与@jpp的答案相比如何,但是我会给它一个机会。
# What we're starting out with
df = pd.DataFrame({'keywords': [{'a': 3, 'b': 4, 'c': 5}, {'c':1, 'd':2}, {'a':5, 'c':21, 'd':4}, {'b':2, 'c':1, 'g':1, 'h':1, 'i':1}]})
# Turns the array of dictionaries into a DataFrame
values_df = pd.DataFrame(df["keywords"].values.tolist())
# Sums up the individual keys
sums = {key:values_df[key].sum() for key in values_df.columns}