2016-06-29 114 views
1

我嘗試用字符串數據總結列。問題是我想忽略NaN,但我沒有找到解決方案。在熊貓中連接字符串

數據幀是這樣的:

s=pd.DataFrame({'A':['(Text,','(Text1,'],'B':['(Text2,','(Text3,'],'C':['(Text4,','(Text5,']}) 


     A  B  C 
0 (Text, (Text2, (Text4, 
1 (Text1, (Text3, (Text5, 

首先,我刪除括號,並用逗號:

sA = s['A'].str.lstrip('(').str.rstrip(',') 
sB = s['B'].str.lstrip('(').str.rstrip(',') 
sC = s['C'].str.lstrip('(').str.rstrip(',') 

然後,我把列在一起。

sNew = sA + ' ' + sB + ' ' + sC 

print sNew 
0 Text Text2 Text4 
1 Text1 Text3 Text5 

有沒有更好的方式來總結列?我有這種感覺,這種方式不是很有效率。 我試過所有列的str.lstrip,但它不起作用。

2. 如果我在一個單元格中有一個NaN,那麼這行將是NaN。在這個特定情況下,我怎麼能忽略NaN? 例如

A  B  C 
0 (Text, (Text2, (Text4, 
1 (Text1, (Text3, NaN 

,我的結果後刪除括號,並總結...

0 Text Text2 Text4 
1 NaN 

,但我想下面的結果...

0 Text Text2 Text4 
1 Text1 Text3 

它將如果你是偉大的爲我解決問題有一些提示!

回答

0

我認爲你可以使用Kiwi解決方案,其中由.strip('(,')添加刪除(,

import pandas as pd 
import numpy as np 

s=pd.DataFrame({'A':['(Text,','(Text1,'], 
       'B':[np.nan,'(Text3,'], 
       'C':['(Text4,',np.nan]}) 
print(s) 

     A  B  C 
0 (Text,  NaN (Text4, 
1 (Text1, (Text3,  NaN 

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

s['new'] = np_concat(s.A, s.B, s.C) 
print (s) 
     A  B  C   new 
0 (Text,  NaN (Text4, Text,Text4 
1 (Text1, (Text3,  NaN Text1,Text3 
+0

那是什麼,我需要。謝謝! – EnergyNet

0

在計算新列之前,可以用空字符串填充數據框的空值。使用fillna這樣的:

s.fillna('',inplace = True)