12 votes

Pandas combiner deux colonnes avec des valeurs nulles

J'ai un df avec deux colonnes et je veux combiner les deux colonnes en ignorant les valeurs NaN. L'astuce est que parfois les deux colonnes ont des valeurs NaN, auquel cas je veux que la nouvelle colonne ait aussi 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 cela :

df['foodstuff'].fillna('') + df['type'].fillna('')

et j'ai obtenu :

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 veux dans cette situation est une valeur NaN car les deux colonnes à combiner sont des NaN.

0      apple-martini
1          apple-pie
2    strawberry-tart
3            dessert
4            None       
dtype: object

25voto

root Points 15363

Utilisez fillna sur une colonne avec les valeurs de remplissage étant une autre colonne :

df['nourriture'].fillna(df['type'])

La sortie résultante :

0      apple-martini
1          apple-pie
2    strawberry-tart
3            dessert
4               None

2voto

piRSquared Points 159
  • remplir les deux colonnes ensemble
  • sum(1) pour les additionner
  • remplacer('', np.nan)

df.remplir('').sum(1).remplacer('', np.nan)

0      apple-martini
1          apple-pie
2    strawberry-tart
3            dessert
4                NaN
dtype: object

2voto

sirfz Points 2394

Vous pouvez utiliser la combine méthode avec un lambda:

df['foodstuff'].combine(df['type'], lambda a, b: ((a or "") + (b or "")) or None, None)

(a or "") renvoie "" si a est None, puis 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).

1voto

Vikash Singh Points 6103

Vous pouvez toujours remplir la chaîne vide dans la nouvelle colonne avec None

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

sortie:

    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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X