如何在应用函数后用多行替换 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
其中 [^.]+
匹配 .
字符以外的任何一个或多个字符。
我有一个 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
其中 [^.]+
匹配 .
字符以外的任何一个或多个字符。