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作为填充值,然后使用paramaxis=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个回路)
- 应用
每个回路13.6 s±343 ms(7次运行的平均值±标准偏差,每个回路1次)%timeit df[eventcol].apply(lambda x: ''.join(x), axis=1)
- 使用字符串方法和cat:
每个回路264 ms±12.3 ms(7次运行的平均值±标准偏差,每个回路1次)%timeit df[eventcol[0]].str.cat(cols, sep=',')
- 使用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