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

Posted

技术标签:

【中文标题】如何使用 pandas 将多行字符串合并为一个?【英文标题】:How to combine multiple rows of strings into one using pandas? 【发布时间】:2016-01-21 16:01:42 【问题描述】:

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

例如:

     words
0    I, will, hereby
1    am, gonna
2    going, far
3    to
4    do
5    this

预期输出:

I, will, hereby, am, gonna, going, far, to, do, this

【问题讨论】:

元素的类型是什么?我猜01 等是索引对吗? 索引类似于 0,1,2,3,4,5,6,7,.... 【参考方案1】:

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

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

【讨论】:

我试过上面提到的代码。它给了我一个错误:AttributeError:'DataFrame'对象没有属性'str'。这是因为数据框中也有空白行吗?如果是这样,我该如何纠正它? .str 访问器仅适用于系列或 DataFrame 的单个列(而不是整个 DataFrame)。如果您想将此方法应用于 DataFrame 的多个列,则需要依次在每一列上单独使用它。 谢谢,你能帮我看看上面的语法吗?如果我想连接数据框df的“单词”列的行,我应该怎么写?感谢您的帮助! 当然 - 要将方法应用于“单词”列,您可以编写 df['words'].str.cat(sep=', ')(其中 df 是您的 DataFrame 的名称)。 我很惊讶str.catjoin() 方法慢。请检查下面的解决方案和时间安排。【参考方案2】:

传统python的join怎么样?而且,它更快。

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

2016 年 12 月 pandas 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

【讨论】:

有趣的时间,我在 0.19.2 上得到了类似的结果。但是,我认为这里的权衡是str.cat 将无缝处理像NaNNone 这样的缺失值(您甚至可以提供na_rep 参数来选择如何表示这些缺失值)。 Python 的 join 在这里失败。您可以通过过滤掉/填充缺失值并然后加入来解决此问题,但这会减慢它的速度。如果列包含分类值,则像这样填充缺失值也会失败; str.cat 有效。 这是如何工作的,如果我不想使用昏迷分隔符?如果我的结果应该是:I will hereby am gonna going far to do this @PV8 你可以尝试用 " ".join(...) 代替 ", ".join(...)【参考方案3】:

如果您有DataFrame 而不是Series,并且您想基于另一列作为“分组依据”键连接来自不同行的值(我认为仅限文本值),那么您可以使用@来自DataFrameGroupBy 类的 987654324@ 方法。这是link to the API manual。

使用 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()
)

【讨论】:

次要评论:需要分配给一个新的数据框,即df2 = df.groupby(...) groupby 与 agg 和 lambda 在较大的数据帧上相当慢...有没有办法加快速度?【参考方案4】:

对于任何想知道如何在dataframe 中组合多行字符串的人, 我提供了一种方法,可以在“类似窗口”的近行范围内连接字符串,如下所示:

# add columns based on 'windows-like' rows
df['windows_key_list'] = pd.Series(df['key'].str.cat([df.groupby(['bycol']).shift(-i)['key'] for i in range(1, windows_size)], sep = ' ')

注意: groupby 无法达到这一点,因为我们不是指行的相同 id,只是行附近。

【讨论】:

以上是关于如何使用 pandas 将多行字符串合并为一个?的主要内容,如果未能解决你的问题,请参考以下文章

将具有相同值的多行合并为pandas中的一行

如何用sql语句将多行合并成一行

将 pandas 中的一个单元格拆分为多行

python pandas将两行或多行文本合并为一行

怎样批量将excel中多行的数据合并为一行,并且自动换行?

如何快速批量将多行的内容,变成一行?