J'ai un df avec deux colonnes et je veux combiner les deux colonnes en ignorant les valeurs NaN. Le hic, c'est que parfois les deux colonnes ont des valeurs NaN, auquel cas je veux que la nouvelle colonne ait également NaN. Voici l'exemple:
df = pd.DataFrame({'foodstuff':['Apple-martini', 'Apple-pie', None, None, None], 'type':[None, None, 'strawberry-tart', 'dessert', None]})
df
Out[10]:
foodstuff type
0 Apple-martini None
1 Apple-pie None
2 None strawberry-tart
3 None dessert
4 None None
J'ai essayé d'utiliser fillna
et de résoudre ce problème:
df['foodstuff'].fillna('') + df['type'].fillna('')
et j'ai eu:
0 Apple-martini
1 Apple-pie
2 strawberry-tart
3 dessert
4
dtype: object
La ligne 4 est devenue une valeur vide. Ce que je ne veux pas dans cette situation, c'est une valeur NaN car les deux colonnes combinées sont des NaN.
0 Apple-martini
1 Apple-pie
2 strawberry-tart
3 dessert
4 None
dtype: object
Utilisez fillna
sur une colonne, les valeurs de remplissage étant l'autre colonne:
df['foodstuff'].fillna(df['type'])
La sortie résultante:
0 Apple-martini
1 Apple-pie
2 strawberry-tart
3 dessert
4 None
fillna
les deux colonnes ensemblesum(1)
pour les ajouterreplace('', np.nan)
df.fillna('').sum(1).replace('', np.nan)
0 Apple-martini
1 Apple-pie
2 strawberry-tart
3 dessert
4 NaN
dtype: object
vous pouvez utiliser la méthode combine
avec un lambda
:
df['foodstuff'].combine(df['type'], lambda a, b: ((a or "") + (b or "")) or None, None)
(a or "")
Retour ""
si a est None
alors la même logique est appliquée à la concaténation (où le résultat serait None
si la concaténation est une chaîne vide).
Vous pouvez toujours remplir la chaîne vide dans la nouvelle colonne avec Aucun
import numpy as np
df['new_col'].replace(r'^\s*$', np.nan, regex=True, inplace=True)
Code complet:
import pandas as pd
import numpy as np
df = pd.DataFrame({'foodstuff':['Apple-martini', 'Apple-pie', None, None, None], 'type':[None, None, 'strawberry-tart', 'dessert', None]})
df['new_col'] = df['foodstuff'].fillna('') + df['type'].fillna('')
df['new_col'].replace(r'^\s*$', np.nan, regex=True, inplace=True)
df
production:
foodstuff type new_col
0 Apple-martini None Apple-martini
1 Apple-pie None Apple-pie
2 None strawberry-tart strawberry-tart
3 None dessert dessert
4 None None NaN