如何使用 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
【问题讨论】:
元素的类型是什么?我猜0
、1
等是索引对吗?
索引类似于 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.cat
比join()
方法慢。请检查下面的解决方案和时间安排。【参考方案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
将无缝处理像NaN
和None
这样的缺失值(您甚至可以提供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 将多行字符串合并为一个?的主要内容,如果未能解决你的问题,请参考以下文章