拆分熊猫文本数据框的行

时间:2021-07-23 05:12:45

标签: python pandas dataframe text

我有一个如下所示的 Pandas 文本数据框:

+-----------------------------------+
|               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的方法来做到这一点吗?

2 个答案:

答案 0 :(得分:0)

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

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

现在要检查长度(运行上述代码后),您可以执行以下操作:

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

答案 1 :(得分:0)

让我们尝试 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