2017-08-20 7 views
0

Mein Beispiel df hat vier Spalten mit NaN Werte. Das Ziel besteht darin, alle Zeilen zu verketten und dabei die Werte NaN auszuschließen.Kombinieren Sie mehrere Spalten in Pandas mit Ausnahme von NaNs

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'keywords_0':["a", np.nan, "c"], 
       'keywords_1':["d", "e", np.nan], 
       'keywords_2':[np.nan, np.nan, "b"], 
       'keywords_3':["f", np.nan, "g"]}) 

    keywords_0 keywords_1 keywords_2 keywords_3 
0   a   d  NaN   f 
1  NaN   e  NaN  NaN 
2   c  NaN   b   g 

möchte folgendes erreichen:

keywords_0 keywords_1 keywords_2 keywords_3 keywords_all 
0   a   d  NaN   f  a,d,f 
1  NaN   e  NaN  NaN   e 
2   c  NaN   b   g  c,b,g 

Pseudo-Code:

cols = [df.keywords_0, df.keywords_1, df.keywords_2, df.keywords_3] 

df["keywords_all"] = df["keywords_all"].apply(lambda cols: ",".join(cols), axis=1) 

Ich weiß, ich kann ",".join() verwenden, um die genaue Ergebnis zu bekommen, aber ich bin nicht sicher, wie das passieren Spaltennamen in die Funktion ein.

Antwort

1

Sie können ",".join() für jede Zeile anwenden, indem Sie axis=1 an die Methode apply übergeben. Sie müssen jedoch zuerst die NaNs fallen lassen. Andernfalls erhalten Sie einen TypeError.

df.apply(lambda x: ','.join(x.dropna()), axis=1) 
Out: 
0 a,d,f 
1  e 
2 c,b,g 
dtype: object 

Sie können diese wieder auf den ursprünglichen Datenrahmen zuweisen mit

df["keywords_all"] = df.apply(lambda x: ','.join(x.dropna()), axis=1) 

Oder wenn Sie Spalten angeben, wie Sie in der Frage haben:

cols = ['keywords_0', 'keywords_1', 'keywords_2', 'keywords_3'] 
df["keywords_all"] = df[cols].apply(lambda x: ','.join(x.dropna()), axis=1) 
+0

für Ihren letzten Satz mit Hilfe braucht er cols zu '[ 'keywords_0', 'keywords_1', 'keywords_2' zu konvertieren , 'keywords_3']] richtig? –

+0

@RayhaneMama Ja, das stimmt. Ich vertraute dem Pseudo-Code, aber ich hätte klarer sein sollen. Vielen Dank. – ayhan

+0

Danke. Das hat super funktioniert! – cptpython

0

Geben Sie einfach eine andere Lösung mit to_string:

df1[df1.isnull()]='' 
df1.apply(lambda x : x.to_string(index =False,na_rep=False),axis=1).replace({"\n":','},regex=True) 

Dann ist es nur keywords_all

df['keywords_all']=df1.apply(lambda x : x.to_string(index =False,na_rep=False),axis=1).replace({"\n":','},regex=True) 

oder

auf Ihre Spalte zuweisen zurück
df.assign(keywords_all=df1.apply(lambda x : x.to_string(index =False,na_rep=False),axis=1).replace({"\n":','},regex=True) 
) 

Out[397]: 
    keywords_0 keywords_1 keywords_2 keywords_3 keywords_all 
0   a   d  NaN   f  a,d,f 
1  NaN   e  NaN  NaN   e 
2   c  NaN   b   g  b,c,g 
Verwandte Themen