2015-12-16 24 views
1

我想連接pandas DataFrame中的兩列。問題是當兩個系列中都有None值時,結果是NaN。 由於實際數據非常大,並且有值保留原始無值以供以後參考,所以我希望不要更改列中的原始值。有沒有辦法在熊貓中實現這一點?用None值連接兩個系列(pandas DataFrame)?

要創建一個示例數據框:

import pandas as pd 
f = pd.DataFrame([['a', 'b','c','a', 'b','c'],['1', '2','3', '4', '5','6', ]]) 
f = f.transpose() 
f.columns = ['xx', 'yy'] 
f.xx[0] = None 
f.yy[0] = None 
f.xx[2] = None 
f.yy[3] = None 

    xx  yy 
0 None None 
1 b  2 
2 None 3 
3 a  None 
4 b  5 
5 c  6 

我試圖f['new_str'] = f.xx + f.yyf['new_str'] = f['xx'] + f['yy']。如果任何值爲None類型,則將連接值設置爲NaN。我認爲這是由於熊貓如何處理None類型。 None類型和str類型不是由'+'運算符「添加」的。

xx  yy  new_str 
0 None None NaN 
1 b  2  b2 
2 None 3  NaN 
3 a  None NaN 
4 b  5  b5 
5 c  6  c6 

這是我想做的事:

f['new_str'] = f.xx.map(lambda x: '') 
for idx, arow in f.iterrows(): 
    con = '' 
    if arow.xx: 
     con += arow.xx 
    if arow.yy: 
     con += arow.yy 
    f.loc[idx,'new_str'] = con 
f 
    xx  yy  new_str 
0 None None  
1 b  2  b2 
2 None 3  3 
3 a  None a 
4 b  5  b5 
5 c  6  c6 

我的問題是,它支持大熊貓更優雅/簡單的方式來實現這一目標?

回答

3

在每列上調用fillna將Nones設置爲'',這是字符串連接下的標識元素。

f['new_str'] = f.xx.fillna('') + f.yy.fillna('') 

這給出了一個新的列格式化你想要的方式:

>>> f 
    xx yy new_str 
0 None None   
1  b  2  b2 
2 None  3  3 
3  a None  a 
4  b  5  b5 
5  c  6  c6 
+2

相同的方法,但不乾淨: 'f.apply(拉姆達行:(行[ 'XX']或 '' )+(行['yy']或''),軸= 1)' –

+0

@pneumatics謝謝。在原始數據中,不需要更改原始字段,因爲「無」和空字符串表示不同的含義。有沒有辦法做到這一點,而不改變原始列?謝謝。 – Bin

+1

@Bin嘗試一下,這不會改變'xx'或'yy'列中的值,因爲它們沒有被分配在左側。 'fillna'工作在數據的副本上。 – pneumatics