Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫组合两个字符串忽略nan值_Python_String_Pandas - Fatal编程技术网

Python 熊猫组合两个字符串忽略nan值

Python 熊猫组合两个字符串忽略nan值,python,string,pandas,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],但这似乎是一个很好的解决办法

我有两列字符串。我希望将它们组合起来并忽略
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]
,但这似乎是一个很好的解决办法。

您可以用一个空字符串填充nan:

df['ColA+ColB'] = df['ColA'].fillna('') + df['ColB'].fillna('')
调用并传递一个空str作为填充值,然后使用param
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

使用
apply
str.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

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

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

    每个回路21.2 ms±1.53 ms(7次运行的平均值±标准偏差,每个10个回路)

  • 应用

    %timeit df[eventcol].apply(lambda x: ''.join(x), axis=1)  
    
    每个回路13.6 s±343 ms(7次运行的平均值±标准偏差,每个回路1次)

  • 使用字符串方法和cat:

    %timeit df[eventcol[0]].str.cat(cols, sep=',')  
    
    每个回路264 ms±12.3 ms(7次运行的平均值±标准偏差,每个回路1次)

  • 使用sum(连接字符串)

    每个回路509 ms±6.03 ms(7次运行的平均值±标准偏差,每个回路1次)


有关更多测试,请参见。在我的例子中,我想用分隔符(a+b+c)将两个以上的列连接在一起

以下语法适用于我:

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和解决方案输出的代码?添加了输入和输出
%timeit df[eventcol].sum(axis=1)  
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