2016-06-29 78 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)