跨栏的Pandas字符串添加

时间:2017-06-30 04:12:24

标签: python pandas

这在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

3 个答案:

答案 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)

更快一点的解决方案是values然后numpy.sum转换为numpy数组:

mfCount & equityCount
相关问题