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】:

使用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 的代码和解决方案的输出? 添加输入输出

以上是关于pandas 结合两个字符串忽略 nan 值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pandas DataFrame 中忽略滚动平均值计算的 NaN 值?

pandas计算dataframe数据行的均值(mean)实战:设置skipna=False则计算行均值时不会忽略NaN值

如果在 Pandas 的任一列中找到,则删除两个 float64 值

Pandas 映射将所有值返回为 NaN [重复]

获取 pandas.read_csv 以将空值读取为空字符串而不是 nan

Pandas | 11 字符串函数