2014-05-03 21 views
9

Ich versuche, Pandas DataFrame Spalten mit NaN-Werten zu verketten.Verketten Sie Spaltenwerte in Pandas DataFrame mit "NaN" -Werten

In [96]:df = pd.DataFrame({'col1' : ["1","1","2","2","3","3"], 
       'col2' : ["p1","p2","p1",np.nan,"p2",np.nan], 'col3' : ["A","B","C","D","E","F"]}) 

In [97]: df 
Out[97]: 
    col1 col2 col3 
0 1 p1 A 
1 1 p2 B 
2 2 p1 C 
3 2 NaN D 
4 3 p2 E 
5 3 NaN F 

In [98]: df['concatenated'] = df['col2'] +','+ df['col3'] 
In [99]: df 
Out[99]: 
    col1 col2 col3 concatenated 
0 1 p1 A   p1,A 
1 1 p2 B   p2,B 
2 2 p1 C   p1,C 
3 2 NaN D   NaN 
4 3 p2 E   p2,E 
5 3 NaN F   NaN 

Statt ‚NaN‘ Werte in „verketteten“ Spalte, ich will „D“ und „F“ jeweils für dieses Beispiel bekommen?

Antwort

14

Ich glaube nicht, dass Ihr Problem trivial ist. Allerdings ist hier eine Abhilfe mit numpy Vektorisierung:

In [49]: def concat(*args): 
    ...:  strs = [str(arg) for arg in args if not pd.isnull(arg)] 
    ...:  return ','.join(strs) if strs else np.nan 
    ...: np_concat = np.vectorize(concat) 
    ...: 

In [50]: np_concat(df['col2'], df['col3']) 
Out[50]: 
array(['p1,A', 'p2,B', 'p1,C', 'D', 'p2,E', 'F'], 
     dtype='|S64') 

In [51]: df['concatenated'] = np_concat(df['col2'], df['col3']) 

In [52]: df 
Out[52]: 
    col1 col2 col3 concatenated 
0 1 p1 A   p1,A 
1 1 p2 B   p2,B 
2 2 p1 C   p1,C 
3 2 NaN D   D 
4 3 p2 E   p2,E 
5 3 NaN F   F 

[6 rows x 4 columns] 
+0

Hey Danke Kiwi, scheint dies der einfachste Weg zu tun. :) –

7

Sie zuerst NaNs mit leeren Saiten, für den gesamten Datenrahmen oder die Spalte (n) ersetzen könnten Sie sich wünschen.

In [6]: df = df.fillna('') 

In [7]: df['concatenated'] = df['col2'] +','+ df['col3'] 

In [8]: df 
Out[8]: 
    col1 col2 col3 concatenated 
0 1 p1 A   p1,A 
1 1 p2 B   p2,B 
2 2 p1 C   p1,C 
3 2   D   ,D 
4 3 p2 E   p2,E 
5 3   F   ,F 
Verwandte Themen