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

4

我有一个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','发生于索引Unnamed: 0')

当我使用轴=1时,我的函数返回的是一列相同的字典,而不是单个字典。


请提供一些样本数据和期望的输出? - cs95
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({'a': srs_tf, 'b': srs_b}) df 的输出字典应为 {'dried': 1, 'oak': 2, 'fruity': 1, 'earthy': 1}。 - mpollinger
1个回答

3
您可以使用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}

谢谢。出于某种我无法理解的原因,当我使用您的代码时,我的输出字典与我的.apply()代码返回的相同字典列完全相同,只是值都被除以2。 - mpollinger
@mpollinger 你是不是在 groupby 内部做这个操作? - cs95
@mpollinger 如果这样的话,恐怕我无法告诉你为什么。但是,我可以保证这是正确的。 - cs95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接