pandas结合两个字符串忽略nan值

时间:2015-10-15 20:57:47

标签: python string pandas

我有两列字符串。我想将它们组合起来并忽略nan值。这样:

ColA, Colb, ColA+ColB
str   str    strstr
str   nan    str
nan   str    str

我尝试了df['ColA+ColB'] = df['ColA'] + df['ColB'],但如果任一列为nan,则会创建一个nan值。我还考虑过使用concat

我想我可以使用它,然后使用一些df.ColA+ColB[df[ColA] = nan] = df[ColA],但这似乎是解决方法。

5 个答案:

答案 0 :(得分:20)

调用fillna并传递一个空的str作为填充值,然后使用参数$array = array( array('A' => array('A', 100, 200)), array('B' => array('B', 100, 200)), ); foreach($array as $key => $subarray){ foreach($subarray as $letter_key => $target_array){ $index_to_delete = array_search($letter_key, $target_array); unset($array[$key][$letter_key][$index_to_delete]); } } print_r($array); 传递sum

axis=1

答案 1 :(得分:11)

你可以用空字符串填充NaN:

df['ColA+ColB'] = df['ColA'].fillna('') + df['ColB'].fillna('')

答案 2 :(得分:4)

使用applystr.cat即可

In [723]: df
Out[723]:
       a      b
0    asd  asdas
1    NaN  asdas
2  asdsa    NaN

In [724]: df['a+b'] = df.apply(lambda x: x.str.cat(sep=''), axis=1)

In [725]: df
Out[725]:
       a      b       a+b
0    asd  asdas  asdasdas
1    NaN  asdas     asdas
2  asdsa    NaN     asdsa

答案 3 :(得分:1)

就我而言,我想将两个以上的列与一个分隔符(a + b + c)结合在一起

In [3]:
df = pd.DataFrame({'a':['asd',np.NaN,'asdsa'], 'b':['asdas','asdas',np.NaN], 'c':['as',np.NaN ,'ds']})

In [4]: df
Out[4]:
       a      b   c
0    asd  asdas   as
1    NaN  asdas   NaN
2  asdsa    NaN   ds

以下语法对我有用:

In [5]: df['d'] = df[['a', 'b', 'c']].fillna('').agg('|'.join, axis=1)

In [6]: df

Out[6]:
      a      b    c             d
0    asd  asdas   as  asd|asdas|as
1    NaN  asdas  NaN       |asdas|
2  asdsa    NaN   ds     asdsa||ds

答案 4 :(得分:0)

比使用apply方法更喜欢添加列。因为它比apply快。

  • 只需添加两列(如果您知道它们是字符串)

    %timeit df.bio + df.procedure_codes  
    

    每个循环21.2毫秒±1.53毫秒(平均±标准偏差,共运行7次,每个循环10个循环)

  • 使用应用

    %timeit df[eventcol].apply(lambda x: ''.join(x), axis=1)  
    

    每个循环13.6 s±343毫秒(平均±标准偏差,共运行7次,每个循环1次)

  • 使用Pandas字符串方法和cat:

    %timeit df[eventcol[0]].str.cat(cols, sep=',')  
    

    每个循环264 ms±12.3 ms(平均±标准偏差,共运行7次,每个循环1次)

  • 使用sum(连接字符串)

    %timeit df[eventcol].sum(axis=1)  
    

    每个循环509毫秒±6.03毫秒(平均±标准偏差,共运行7次,每个循环1个循环)

有关更多测试,请参见here