2014-05-03 43 views
9

Tôi đang cố gắng ghép các khối Pandas DataFrame với các giá trị NaN.Kết hợp các giá trị cột trong Pandas DataFrame với các giá trị "NaN"

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 

Thay vì các giá trị 'NaN' trong cột "nối", tôi muốn để có được "D" và "F" tương ứng ví dụ này?

Trả lời

14

Tôi không nghĩ vấn đề của bạn là tầm thường. Tuy nhiên, đây là một cách giải quyết sử dụng vector hóa NumPy:

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

Xin cảm ơn Kiwi, Dường như đây là cách dễ nhất để thực hiện. :) –

7

Trước tiên, bạn có thể thay thế Nans với chuỗi rỗng, cho cả dataframe hoặc cột (s) mà bạn mong muốn.

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 
Các vấn đề liên quan