pandas 熊猫组合两个字符串忽略 nan 值
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/33158417/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
pandas combine two strings ignore nan values
提问by As3adTintin
I have two columns with strings. I would like to combine them and ignore nanvalues. Such that:
我有两列带字符串的列。我想将它们结合起来并忽略nan值。这样:
ColA, Colb, ColA+ColB
str str strstr
str nan str
nan str str
I tried df['ColA+ColB'] = df['ColA'] + df['ColB']but that creates a nan value if either column is nan. I've also thought about using concat.
我试过了,df['ColA+ColB'] = df['ColA'] + df['ColB']但如果任一列是 nan,就会创建一个 nan 值。我也考虑过使用concat.
I suppose I could just go with that, and then use some df.ColA+ColB[df[ColA] = nan] = df[ColA]but that seems like quite the workaround.
我想我可以继续使用它,然后使用一些,df.ColA+ColB[df[ColA] = nan] = df[ColA]但这似乎是一个很好的解决方法。
回答by EdChum
Call fillnaand pass an empty str as the fill value and then sumwith param axis=1:
调用fillna并传递一个空 str 作为填充值,然后sum使用 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
回答by AChampion
You could fill the NaN with an empty string:
您可以用空字符串填充 NaN:
df['ColA+ColB'] = df['ColA'].fillna('') + df['ColB'].fillna('')
回答by Zero
Using applyand str.catyou can
使用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
回答by Kevin Chou
Prefer adding the columns than use applymethod. cuz it's faster than apply.
更喜欢添加列而不是使用apply方法。因为它比apply.
Just add the two columns (if you know they are strings)
%timeit df.bio + df.procedure_codes21.2 ms ± 1.53 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Use apply
%timeit df[eventcol].apply(lambda x: ''.join(x), axis=1)13.6 s ± 343 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Use Pandas string methods and cat:
%timeit df[eventcol[0]].str.cat(cols, sep=',')264 ms ± 12.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Using sum (which concatenate strings)
%timeit df[eventcol].sum(axis=1)509 ms ± 6.03 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
只需添加两列(如果您知道它们是字符串)
%timeit df.bio + df.procedure_codes每个循环 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 次循环)
使用 Pandas 字符串方法和 cat:
%timeit df[eventcol[0]].str.cat(cols, sep=',')每个循环 264 ms ± 12.3 ms(7 次运行的平均值 ± 标准偏差,每次 1 次循环)
使用 sum(连接字符串)
%timeit df[eventcol].sum(axis=1)每个循环 509 ms ± 6.03 ms(7 次运行的平均值 ± 标准偏差,每次 1 次循环)
see herefor more tests
更多测试请看这里
回答by Vaulstein
In my case, I wanted to join more than 2 columns together with a separator (a+b+c)
就我而言,我想用分隔符 (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
The following syntax worked for me:
以下语法对我有用:
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

