如何使用.apply()将一列词典合并为一个词典?

时间:2019-04-13 20:41:06

标签: python pandas

我在熊猫数据框中有一列词典。

srs_tf = pd.Series([{'dried': 1, 'oak': 2},{'fruity': 2, 'earthy': 2},{'tones': 2, 'oak': 4}]) 
srs_b = pd.Series([2,4,6]) 
df = pd.DataFrame({'tf': srs_tf, 'b': srs_b}) 

df

                           tf  b
0      {'dried': 1, 'oak': 2}  2
1  {'fruity': 2, 'earthy': 2}  4
2      {'tones': 2, 'oak': 4}  6

这些词典代表了葡萄酒描述中的单词频率(例如输入词典:{'savory':1,'dried':3,'thyme':1,'notes':..})。我需要从此字典列中创建一个输出字典,其中包含输入字典中的所有键,并将它们映射到 输入字典数 中,这些键是当下。例如,单词“ dried”是输入字典中的850键,因此在输出字典{..'dried':850 ...}中。

我想尝试使用数据框.apply()方法,但是我认为使用不正确。

def worddict(row, description_counter):
    for key in row['tf'].keys():
        if key in description_counter.keys():
            description_counter[key] += 1
        else:
            description_counter[key] = 1
    return description_counter

description_counter = {}

output_dict = df_wine_list.apply(lambda x: worddict(x, description_counter), axis = 1)

几件事。我认为我的轴应= 0而不是1,但尝试时会出现此错误:KeyError:('tf','发生在未命名的索引:0')

当我确实使用axis = 1时,我的函数将返回一列具有相同字典的字典,而不是单个字典。

1 个答案:

答案 0 :(得分:2)

您可以使用chainCounter

from collections import Counter
from itertools import chain

Counter(chain.from_iterable(df['a']))
# Counter({'dried': 1, 'earthy': 1, 'fruity': 1, 'oak': 2, 'tones': 1})

或者,

Counter(y for x in df['a'] for y in x)
# Counter({'dried': 1, 'earthy': 1, 'fruity': 1, 'oak': 2, 'tones': 1})

您也可以使用Index.value_counts

pd.concat(map(pd.Series, df['a'])).index.value_counts().to_dict()
# {'dried': 1, 'earthy': 1, 'fruity': 1, 'oak': 2, 'tones': 1}