1
votes

Créer une nouvelle colonne de listes dans le cadre de données Pandas avec des valeurs uniques d'une autre colonne

J'ai un dataframe avec une colonne de listes:

TypeError: 'float' object is not iterable

Je dois créer une nouvelle colonne où elle montre une liste distincte pour chaque ligne si des doublons existent dans la liste, sinon juste le même liste.

df['new_col'] = df['full_list_to_check'].apply(lambda x: list(set(x)))

J'ai essayé ceci:

  full_list_to_check            new_col
 0          NaN                   NaN
 1          NaN                   NaN
 2    [1, 2, 3, 4, 5]           [1, 2, 3, 4, 5]
 3        [6, 6]                  [6]
 4        [11, 11]                [11]

Mais j'obtiens cette erreur:

    full_list_to_check
 0          NaN 
 1          NaN 
 2    [1, 2, 3, 4, 5] 
 3        [6, 6] 
 4        [11, 11] 


1 commentaires

remplacez votre valeur nan par une chaîne vide, dataframe.fillna ('', inplace = True). ça va marcher.


3 Réponses :


2
votes

Vous devez vérifier Nan:

0                NaN
1                NaN
2    [1, 2, 3, 4, 5]
3                [6]
4               [11]

Update:

df['full_list_to_check'].apply(lambda x: list(set(x)) if x is not np.nan else np.nan)
df['full_list_to_check'].apply(lambda x: list(set(x)) if not np.any(pd.isna(x)) else np.nan)

p>


4 commentaires

pourquoi sinon np.any (pd.isna (x)) au lieu de si x n'est pas np.nan ?


@deadvoid pd.isna (x) liste de retour


@Mikhail juste vraiment curieux, si le but est de filtrer NaN alors, pourquoi exige [True, True, False, ...] ? Je veux dire dans ce cas, tout est soit NaN, soit une liste, si le but est de le rendre plus général afin qu'il puisse être applicable ... Je suppose que j'essaie juste de comprendre.


@DimaFirst ah, d'accord .. Je pensais qu'il y avait une raison que je ne connaissais pas, comme pour la performance ou d'autres :) mais c'est tout bon, juste honnêtement curieux



2
votes

Vous pouvez essayer ceci:

full_list_to_check new_col
0 NaN              NaN
1 NaN              NaN
2 [1, 2, 3, 4, 5]  [1, 2, 3, 4, 5]
3 [6, 6]           [6]
4 [11, 11]         [11]
df['new_col'] = df.loc[~df['full_list_to_check'].isna(), 'full_list_to_check'].apply(lambda x: list(set(x)))


0 commentaires

2
votes

Vous pouvez utiliser:

df['new_col'] = df['full_list_to_check'].apply(lambda x: list(set(x)) if isinstance(x,list) else x)

Les autres réponses ne fonctionnent que s'il n'y a pas d'autres valeurs que des listes ou NaN dans vos données.


0 commentaires