web-dev-qa-db-fra.com

pandas combine 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. 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
17
vagabond

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
33
root
  • fillna les deux colonnes ensemble
  • sum(1) pour les ajouter
  • replace('', np.nan)

df.fillna('').sum(1).replace('', np.nan)

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

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).

2
sirfz

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
1
Vikash Singh