2017-10-30 2 views
0

Hallo habe ich Pandas Datenrahmen, der wie folgt aussieht:einen Datenrahmen mit vielen NaN Merging

 0   1 2   3   4  5  6 
150 NaN   NaN NaN  NaN March 1980 NaN NaN 
151 NaN   NaN NaN  NaN June 1990 NaN NaN 
152 NaN   NaN NaN Sep 2015   NaN NaN NaN 
153 NaN   NaN NaN Jan 1972   NaN NaN NaN 
154 NaN   NaN NaN Mar 1974   NaN NaN NaN 

Ich kann nicht dropna() verwenden, denn ich eine leere Datenrahmen habe.

Alle Spalten haben eine Daten in einer Spalte, gibt es eine Möglichkeit, es in einer Spalte DataFrame zu transformieren?

  0   
150 March 1980 
151 June 1990 
152 Sep 2015 
153 Jan 1972 
154 Mar 1974 

Danke.

+0

Mögliche Duplikate von [Wie um Zeilen von Pandas DataFrame zu löschen, deren Wert in bestimmten Spalten NaN ist] (https://stackoverflow.com/q/13413590/1278112) –

+0

@ShiheZhang Nicht das dupe des verknüpften, sondern ein Betrüger einer anderen Frage. – Dark

Antwort

4

Versuchen

df = df.fillna('').sum(1) 

oder

df = df.fillna('').apply(''.join, axis = 1) 

Sie erhalten

150 March 1980 
151  June 1990 
152  Sep 2015 
153  Jan 1972 
154  Mar 1974 
dtype: object 
+0

Danke, es hat perfekt funktioniert, aber was ist die .sum (1) tut ?, Ich möchte glauben, dass es die anderen Spalten summiert und weil sie leere Saiten sind, kollabiert es zu einem? –

+0

Wir verwenden hier die Summe an Stelle von Join, da der Dtyp eindeutig ein Objekt ist. Seine Entsprechung zu sagen df.fillna (''). Apply (''. Join, Achse = 1) – Vaishali

+0

Vielen Dank =) –

3

Wollen Sie das?

df.apply(lambda x : sorted(x,key=pd.isnull),axis=1).dropna(1) 
Out[1052]: 
      0 
150 March1980 
151 June1990 
152 Sep2015 
153 Jan1972 
154 Mar1974 

Oder

df.bfill(1).iloc[:,0] 
Out[1056]: 
150 March1980 
151  June1990 
152  Sep2015 
153  Jan1972 
154  Mar1974 
Name: 0, dtype: object 

Oder

df.stack() 
Out[1058]: 
150 4 March1980 
151 4  June1990 
152 3  Sep2015 
153 3  Jan1972 
154 3  Mar1974 
dtype: object 
+0

bfill ist sehr interessant, kann aber nicht wieder upvote;) – Vaishali

+0

@Vaishali Ja, 'summe' ist gut :-) – Wen

+0

habe ich upvote. Irgendwelche Fragen zu meinem Sol? – Dark

1

Eine andere Lösung mit Hilfe von Booleschen Maske ist und pd.notnull, die viel viel schneller als sum ist und sorted dh

sdf = pd.DataFrame(df.values[pd.notnull(df)],index=df.index) 

Ausgang:

 
      0 
150 March1980 
151 June1990 
152 Sep2015 
153 Jan1972 
154 Mar1974 
ndf = pd.concat([df.reset_index(drop=True)]*1000) 

%%timeit 
ndf.apply(lambda x : sorted(x,key=pd.isnull),axis=1).dropna(1) 
1 loop, best of 3: 1.29 s per loop 

%%timeit 
ndf.bfill(1).iloc[:,0] 
1 loop, best of 3: 773 ms per loop 

%%timeit 
ndf.fillna('').sum(1) 
10 loops, best of 3: 26.4 ms per loop 

%%timeit 
pd.DataFrame(ndf.values[pd.notnull(ndf)],index=ndf.index) 
100 loops, best of 3: 3.11 ms per loop 
Verwandte Themen