2017-01-03 4 views
5

Ich habe ein df mit zwei Spalten und ich möchte beide Spalten kombinieren, die NaN-Werte ignorieren. Der Haken ist, dass manchmal beide Spalten NaN-Werte haben. In diesem Fall möchte ich, dass die neue Spalte auch NaN hat. Hier ist das Beispiel:Pandas kombinieren zwei Spalten mit Nullwerten

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 

Ich versuchte fillna zu verwenden und diese lösen:

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

und ich bekam:

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

Die Zeile 4 ein Leerwert geworden ist. Was ich in dieser Situation wollte, ist ein NaN-Wert, da beide kombinierenden Säulen NaNs sind.

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

Antwort

11

Verwenden fillna auf einer Spalte mit t er füllen Werte die andere Spalte zu sein:

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

Die resultierende Ausgabe:

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

Sie immer mit None die leere Zeichenfolge in der neuen Spalte füllen

import numpy as np 

df['new_col'].replace(r'^\s*$', np.nan, regex=True, inplace=True) 

komplette Code:

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 

Ausgang:

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
  • fillna beide Spalten zusammen
  • sum(1) hinzufügen sie
  • 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

können Sie die combine Methode mit einem lambda verwenden:

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

(a or "") kehrt "" wenn a None dann die gleiche Logik auf die Verkettung angewendet wird (wobei das Ergebnis None wenn die Verkettung wäre ist eine leere Zeichenfolge).

Verwandte Themen