J'ai un dataframe contenant une colonne de listes.

names                                       unique_values
[B-PER,I-PER,I-PER,B-PER]                        2
[I-PER,N-PER,B-PER,I-PER,A-PER]                  4
[B-PER,A-PER,I-PER]                              3
[B-PER, A-PER,A-PER,A-PER]                       2

Je dois compter chaque valeur distincte dans une colonne de listes et si la valeur apparaît plus d'une fois, comptez-la comme une. Comment puis-je y parvenir

Merci

0
Bilal 17 mars 2021 à 06:24

3 réponses

Meilleure réponse

Combinez explode avec nunique

df["unique_values"] = df.names.explode().groupby(level = 0).nunique()
2
BENY 17 mars 2021 à 03:53

Essayer:

df["unique_values"] = df.names.explode().groupby(level = 0).unique().str.len()

Sortie

df
                                 names  unique_values
0         [B-PER, I-PER, I-PER, B-PER]              2
1  [I-PER, N-PER, B-PER, I-PER, A-PER]              4
2                [B-PER, A-PER, I-PER]              3
3         [B-PER, A-PER, A-PER, A-PER]              2
0
Pablo C 17 mars 2021 à 03:45

Pour ce faire, vous pouvez utiliser le type de données inbulit set -

df['unique_values'] = df['names'].apply(lambda a : len(set(a)))

Cela fonctionne comme des ensembles n'autorisant aucun élément en double dans leur construction, donc lorsque vous convertissez une liste en ensemble, cela supprime tous les éléments en double et tout ce que vous devez faire est d'obtenir la longueur de l'ensemble résultant.

Pour ignorer les valeurs NaN dans une liste, vous pouvez faire ce qui suit -

df['unique_values'] = df['names'].apply(lambda a : len([x for x in set(a) if str(x) != 'nan'])) 
1
Karan Shishoo 17 mars 2021 à 03:54