使用pandas对列表中的值进行计数,并连接输出的键和值名称

2024-04-23 16:34:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要帮助从字典(python3)获得一些输出:

{'horse': ['brown', 'black'], 'duck': ['brown', 'black', 'brown', 'grey', 'brown']}

所需产出:

black horse: 1
brown horse: 1
grey horse: 0
black duck: 1
brown duck: 3
grey duck: 1

有人能提供一个解决方案吗


Tags: 字典解决方案python3greyblackduckbrownhorse
3条回答

因为您标记了pandado explode,所以传递crosstab计数频率,并用join压平索引

s=pd.Series(d).explode()
s=pd.crosstab(s.index,s).stack()
s.index=s.index.map('_'.join)
s.to_dict()
{'duck_black': 1, 'duck_brown': 3, 'duck_grey': 1, 'horse_black': 1, 'horse_brown': 1, 'horse_grey': 0}

我想这可以进一步优化,但您可以尝试:

d={'horse': ['brown', 'black'], 'duck': ['brown', 'black', 'brown', 'grey', 'brown']}

s=pd.Series(d).explode()
import itertools
l=[*map(' '.join,itertools.product(s.index.unique(),s.unique()))]
print(s.reset_index().agg(' '.join,1).value_counts().reindex(l,fill_value=0))

horse brown    1
horse black    1
horse grey     0
duck brown     3
duck black     1
duck grey      1
dtype: int64

如果希望仅在Python中执行此操作:

您可以使用来自^{}模块的^{}

In [622]: from collections import Counter
In [623]: d = {'horse': ['brown', 'black'], 'duck': ['brown', 'black', 'brown', 'grey', 'brown']} 

In [611]: l = [j + ' ' + key for key, value in d.items() for j in value]

In [620]: Counter(l)                   
Out[620]: 
Counter({'brown horse': 1,
     'black horse': 1,
     'brown duck': 3,
     'black duck': 1,
     'grey duck': 1})

相关问题 更多 >