У меня есть 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
note: ни один элемент не встречается дважды в одной строке в исходном DataFrame.
Используя collections.Counter
, вы можете sum
итерабельность объектов Counter
. Поскольку Counter
является подклассом dict
, вы можете pd.DataFrame.from_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
Не уверен, как это сравнивается с точки зрения оптимизации с ответом @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}