【问题标题】:Split rows of pandas textual dataframe拆分熊猫文本数据框的行
【发布时间】:2021-07-23 05:12:45
【问题描述】:

我有一个看起来像这样的熊猫文本数据框:

+-----------------------------------+
|               text                |
+-----------------------------------+
| A very long sentence              |
+-----------------------------------+
| Another very long sentence        |
+-----------------------------------+

但我想用每行不超过 512 个单词的句子分割每一行:

+-----------------------------------+
|               text                |
+-----------------------------------+
| A piece of very long sentence     |
+-----------------------------------+
| One more piece of long sentence   |
+-----------------------------------+

我可以将我的数据转换为 python 列表,但 str.split() 可以使用分隔符。

有pythonic的方法吗?

【问题讨论】:

  • 所以假设第一句话由2048个单词组成,那么你将它分成连续的4行?是这样吗?
  • 你在什么意义上考虑单词?..ie..like这句话A piece of very long sentence是29个单词还是6个单词?

标签: python pandas dataframe text


【解决方案1】:

让我们尝试str.split 通过空格将文本拆分为“单词”,然后使用Series.apply 将单词列表分块为512 组。然后用DataFrame.explode拆分成多行:

limit = 512  # Set to limit words per row
df['text'] = (
    df['text'].str.split().apply(lambda s: [
        ' '.join(s[pos:pos + limit])  # group into 512 size chunks
        for pos in range(0, len(s), limit)
    ])
)
# Explode Into Multiple Rows
df = df.explode('text')

*请注意,此方法与' ' 连接,这意味着如果保存了格式信息,例如\n 或\t,这将丢失。


使用lorem生成示例数据的示例程序:

import random

import pandas as pd
from lorem.text import TextLorem

random.seed(5)  # For reproducibility
gen = TextLorem(srange=(512, 1023))

df = pd.DataFrame({'text': [gen.sentence() for _ in range(2)]})

limit = 512
df['text'] = (
    df['text'].str.split().apply(lambda s: [
        ' '.join(s[pos:pos + limit])  # group into 512 size chunks
        for pos in range(0, len(s), limit)
    ])
)
# Explode Into Multiple Rows
df = df.explode('text')

# Sanity Check to count words per row
df['word_count'] = df['text'].str.split().str.len()
print(df)

df:

                                                text  word_count
0  Tempora labore velit sit voluptatem tempora qu...         512
0  quiquia quaerat sit sit quisquam quisquam non ...         261
1  Ut labore ipsum aliquam sit adipisci sed neque...         512
1  quisquam velit sit ipsum tempora amet aliquam ...         352

【讨论】:

    【解决方案2】:

    如果句子由' '分隔,您可以通过str.split()+str.join()尝试:

    df['text']=df['text'].str.split().str[:512].str.join(' ')
    

    现在要检查长度(运行上述代码后),您可以这样做:

    df['text_len']=df['text'].str.split().str.len()
    

    【讨论】:

    • 我的数据集有 10931 行,运行代码后它也有 10931 行。 'text_len' 列的值有 53、219、76、114 等。我不知道为什么它会这样工作):
    • @alyferryhalo 它不会影响数据框的长度或形状,它会使文本列内的句子长度为 512 或更少,具体取决于每个句子的单词数......换句话说,文本中的句子不超过 512 个单词
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 2013-06-23
    • 2019-10-26
    • 2021-12-27
    • 1970-01-01
    • 2019-05-29
    • 2013-07-08
    相关资源
    最近更新 更多