pandas 结合两个字符串忽略 nan 值
Posted
技术标签:
【中文标题】pandas 结合两个字符串忽略 nan 值【英文标题】:pandas combine two strings ignore nan values 【发布时间】: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]
,但这似乎是一种解决方法。
【问题讨论】:
【参考方案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】:使用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
【讨论】:
【参考方案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 的代码和解决方案的输出? 添加输入输出以上是关于pandas 结合两个字符串忽略 nan 值的主要内容,如果未能解决你的问题,请参考以下文章
如何在 pandas DataFrame 中忽略滚动平均值计算的 NaN 值?
pandas计算dataframe数据行的均值(mean)实战:设置skipna=False则计算行均值时不会忽略NaN值
如果在 Pandas 的任一列中找到,则删除两个 float64 值