如何使用pandas将多行字符串合并为一个?

ecl*_*irs 11 python text concatenation dataframe pandas

我有一个包含多行的DataFrame.有没有什么方法可以将它们组合成一个字符串?

例如:

     words
0    I, will, hereby
1    am, gonna
2    going, far
3    to
4    do
5    this
Run Code Online (Sandbox Code Playgroud)

预期产量:

I, will, hereby, am, gonna, going, far, to, do, this
Run Code Online (Sandbox Code Playgroud)

Ale*_*ley 18

您可以使用它str.cat来连接每行中的字符串.对于系列或列s,请写:

>>> s.str.cat(sep=', ')
'I, will, hereby, am, gonna, going, far, to, do, this'
Run Code Online (Sandbox Code Playgroud)

  • .str访问器仅适用于DataFrame的Series或单个列(而不是整个DataFrame)。如果要将此方法应用于DataFrame的多个列,则需要依次在每个列上单独使用它。 (2认同)

Zer*_*ero 10

传统的蟒蛇怎么样join?而且,它更快.

In [209]: ', '.join(df.words)
Out[209]: 'I, will, hereby, am, gonna, going, far, to, do, this'
Run Code Online (Sandbox Code Playgroud)

2016年12月关于熊猫的计时0.18.1

In [214]: df.shape
Out[214]: (6, 1)

In [215]: %timeit df.words.str.cat(sep=', ')
10000 loops, best of 3: 72.2 µs per loop

In [216]: %timeit ', '.join(df.words)
100000 loops, best of 3: 14 µs per loop

In [217]: df = pd.concat([df]*10000, ignore_index=True)

In [218]: df.shape
Out[218]: (60000, 1)

In [219]: %timeit df.words.str.cat(sep=', ')
100 loops, best of 3: 5.2 ms per loop

In [220]: %timeit ', '.join(df.words)
100 loops, best of 3: 1.91 ms per loop
Run Code Online (Sandbox Code Playgroud)

  • 有趣的时间,我在0.19.2得到了类似的结果.但是,我认为这里的权衡是`str.cat`将无缝地处理缺失值,如`NaN`和`None`(你甚至可以提供`na_rep`参数来选择如何表示这些缺失值).Python的`join`在这里失败了.您可以通过过滤/填写缺失值和*然后*加入来解决这个问题,但这会使其减慢速度.如果列包含分类值,则填充此类缺失值也会失败; `str.cat`正常工作. (2认同)

小智 7

如果您使用a DataFrame而不是a,Series并且希望将基于另一列的不同行中的值(我认为仅文本值)作为“ group by”键进行连接,则可以使用.agg类中的方法DataFrameGroupBy。这是API手册链接

使用Pandas v0.18.1测试的示例代码:

import pandas as pd

df = pd.DataFrame({
    'category': ['A'] * 3 + ['B'] * 2,
    'name': ['A1', 'A2', 'A3', 'B1', 'B2'],
    'num': range(1, 6)
})

df.groupby('category').agg({
    'name': lambda x: ', '.join(x),
    'num': lambda x: x.max()
})
Run Code Online (Sandbox Code Playgroud)