J'ai besoin d'aide pour obtenir des sorties d'un dictionnaire (python3):

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

Sorties requises:

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

Quelqu'un peut-il offrir une solution s'il vous plaît?

2
Rob John 31 mai 2020 à 20:15

2 réponses

Meilleure réponse

Puisque vous marquez panda faites explode, puis passez crosstab comptez la fréquence, et aplatissez l'index avec 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}
3
BEN_YO 31 mai 2020 à 18:02

Je suppose que cela peut être optimisé davantage, mais vous pouvez essayer:

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
4
anky 31 mai 2020 à 17:25