这在Python中完全合法:
In [1]: 'abc' + 'def'
Out[1]: 'abcdef'
如果我有一个全文Pandas DataFrame,如下例所示:
In [2]: df = pd.DataFrame([list('abcd'), list('efgh'), list('ijkl')],
columns=['C1','C2','C3','C4'])
df.loc[[0,2], ['C2', 'C3']] = np.nan
df
Out[2]: C1 C2 C3 C4
0 a NaN NaN d
1 e f g h
2 i NaN NaN l
是否可以对上述DataFrame的列执行相同的操作?类似的东西:
In [3]: df.apply(+, axis=1) # Or
df.sum(axis=1)
请注意,上述两个语句都不起作用。在循环中使用.str.cat()
很容易,但我正在寻找更好的东西。
预期输出为:
Out[3]: C
0 ad
1 efgh
2 il
答案 0 :(得分:5)
你可以做到
df.fillna('').sum(axis=1)
当然,这假设您的数据帧仅由字符串和NaN组成。
答案 1 :(得分:4)
选项1
stack
我想将其添加进行演示。我们不必接受数据框的矩形特性并使用stack
。我们这样做时,stack
默认会丢弃nan
。给我们留下一个字符串向量和一个pd.MultiIndex
。我们可以groupby
pd.MultiIndex
的第一级(曾经是行索引)并执行求和:
df.stack().groupby(level=0).sum()
0 ad
1 efgh
2 il
dtype: object
<强>选项2 强>
使用蒙面数组np.ma.masked_array
我被@jezrael的动机发布了一个更快的解决方案( - :
pd.Series(
np.ma.masked_array(
df.values,
df.isnull().values,
).filled('').sum(1),
df.index
)
0 ad
1 efgh
2 il
dtype: object
计时
df = pd.concat([df]*1000).reset_index(drop=True)
%%timeit
pd.Series(
np.ma.masked_array(
df.values,
df.isnull().values,
fill_value=''
).filled('').sum(1),
df.index
)
1000 loops, best of 3: 860 µs per loop
%timeit (pd.Series(df.fillna('').values.sum(axis=1), index=df.index))
1000 loops, best of 3: 1.33 ms per loop
答案 2 :(得分:2)