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]
3 Réponses :
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>
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
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)))
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.
remplacez votre valeur nan par une chaîne vide, dataframe.fillna ('', inplace = True). ça va marcher.