如何在应用函数后用多行替换 pandas 中的一行?

How to replace a row in pandas with multiple rows after applying a function?

我有一个 pandas 数据框,它只包含一个包含字符串的列。我想对每一行应用一个函数,将字符串按句子拆分,并用函数生成的行替换该行。

示例数据框:

import pandas as pd
df = pd.DataFrame(["A sentence. Another sentence. More sentences here.", "Another line of text"])

df.head() 的输出:

                                                   0
0  A sentence. Another sentence. More sentences h...
1                               Another line of text

我尝试使用 apply() 方法如下:

def get_sentence(row):
    return pd.DataFrame(re.split('\.', row[0]))
df.apply(get_sentence, axis=1)

但是 df.head() 给出:

0                          0
0            A sentenc...
1                            0
0  Another line of text

我希望输出为:

                     0
0            A sentence
1      Another sentence
2   More sentences here
3  Another line of text

正确的做法是什么?

将所有字符串转换为 'flat' 列表,并构建一个新的 DataFrame 或系列。

pd.DataFrame([item for sublist in list(df[0].str.split('.')) for item in sublist])

不过要小心。如果您的元素仅由“.”组成,这将导致 weird/blank 新行。

您可以使用

df[0].str.split(r'\.(?!$)').explode().reset_index(drop=True).str.rstrip('.')

输出:

0               A sentence
1         Another sentence
2     More sentences here
3     Another line of text

\.(?!$) 正则表达式匹配不在字符串末尾的点。 .explode() 跨行拆分结果,.reset_index(drop=True) 重置索引。 .str.rstrip('.') 将删除尾随点。

你也可以使用Series.str.findall版本:

>>> df[0].str.findall(r'[^.]+').explode().reset_index(drop=True)
0              A sentence
1        Another sentence
2     More sentences here
3    Another line of text

其中 [^.]+ 匹配 . 字符以外的任何一个或多个字符。