我有两列字符串。我想将它们组合起来并忽略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]
,但这似乎是解决方法。
答案 0 :(得分:20)
调用fillna
并传递一个空的str作为填充值,然后使用参数$array = array(
array('A' => array('A', 100, 200)),
array('B' => array('B', 100, 200)),
);
foreach($array as $key => $subarray){
foreach($subarray as $letter_key => $target_array){
$index_to_delete = array_search($letter_key, $target_array);
unset($array[$key][$letter_key][$index_to_delete]);
}
}
print_r($array);
传递sum
:
axis=1
答案 1 :(得分:11)
你可以用空字符串填充NaN:
df['ColA+ColB'] = df['ColA'].fillna('') + df['ColB'].fillna('')
答案 2 :(得分:4)
使用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
答案 3 :(得分:1)
就我而言,我想将两个以上的列与一个分隔符(a + b + c)结合在一起
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
答案 4 :(得分:0)
比使用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 s±343毫秒(平均±标准偏差,共运行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毫秒±6.03毫秒(平均±标准偏差,共运行7次,每个循环1个循环)
有关更多测试,请参见here