【问题标题】:pandas combine two strings ignore nan valuespandas 结合两个字符串忽略 nan 值
【发布时间】:2016-01-14 11:52:15
【问题描述】:

我有两列带字符串。我想将它们结合起来并忽略 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],但这似乎是一种解决方法。

【问题讨论】:

    标签: python string pandas


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      调用fillna 并传递一个空的str 作为填充值,然后传递sum 和参数axis=1

      In [3]:
      df = pd.DataFrame({'a':['asd',np.NaN,'asdsa'], 'b':['asdas','asdas',np.NaN]})
      df
      
      Out[3]:
             a      b
      0    asd  asdas
      1    NaN  asdas
      2  asdsa    NaN
      
      In [7]:
      df['a+b'] = df.fillna('').sum(axis=1)
      df
      
      Out[7]:
             a      b       a+b
      0    asd  asdas  asdasdas
      1    NaN  asdas     asdas
      2  asdsa    NaN     asdsa
      

      【讨论】:

        【解决方案3】:

        使用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
        

        【讨论】:

          【解决方案4】:

          比使用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 秒 ± 343 毫秒(平均值 ± 标准偏差,7 次运行,每个循环 1 个)

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

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

            每个循环 264 毫秒 ± 12.3 毫秒(平均值 ± 标准偏差。7 次运行,每个循环 1 个)

          • 使用 sum(连接字符串)

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

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

          更多测试请参见here

          【讨论】:

            【解决方案5】:

            就我而言,我想用分隔符 (a+b+c) 将超过 2 列连接在一起

            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
            

            【讨论】:

            • 为什么不包括创建 df 的代码和解决方案的输出?
            • 添加输入输出
            猜你喜欢
            • 1970-01-01
            • 2014-11-26
            • 2017-01-11
            • 2013-07-12
            • 2016-10-11
            • 1970-01-01
            • 2019-06-03
            • 2013-07-10
            • 1970-01-01
            相关资源
            最近更新 更多