如何基于Pandas DataFrame中的NaN值创建句子编号列
问题
我有一个Pandas DataFrame,其中“Word”列每行存储一个单词,句子之间以空串(对应空行)分隔,因此设置skip_blank_lines=False来保留分隔情况。读取数据的代码如下:
df = pd.read_csv("Data-June-2023.txt", sep=" ", skip_blank_lines=False) df.tail(20)
数据示例:
Index Word _ _ Tag 0 I _ _ O 1 am _ _ O 2 from _ _ O 3 Madrid _ _ B-City 4 NaN NaN NaN NaN 5 Alice _ _ B-Person 6 likes _ _ O 7 Bob _ _ B-Person
需求:创建名为“Sentence #”的新列,每遇到“Word”列的NaN值时,为后续新句子分配递增编号(如Sentence: 1、Sentence: 2等),仅在每个句子的首行显示编号,其余行留空。期望输出格式如下:
Index Sentence # Word _ _ Tag 0 Sentence: 1 I _ _ O 1 am _ _ O 2 from _ _ O 3 Oxford _ _ B-City 4 NaN NaN NaN NaN 5 Sentence: 2 Alice _ _ B-Person 6 likes _ _ O 7 Bob _ _ B-Person 8 NaN NaN NaN NaN 9 Sentence: 3 Alice _ _ B-Person
解决方案
通过以下步骤可实现需求:
实现代码
import pandas as pd # 读取数据(保留空行) df = pd.read_csv("Data-June-2023.txt", sep=" ", skip_blank_lines=False) # 1. 标记句子分隔行:Word列为NaN时标记为1,其余为0 df['separator_flag'] = df['Word'].isna().astype(int) # 2. 生成句子编号:累积分隔标记数+1,得到当前行所属的句子编号 df['sentence_id'] = df['separator_flag'].cumsum() + 1 # 3. 创建并填充Sentence #列 df['Sentence #'] = '' # 识别每个句子的首行:第一行 或 分隔行的下一行 sentence_starts = (df['separator_flag'].shift(1, fill_value=1) == 1) & (df['separator_flag'] == 0) # 为首行填充编号 df.loc[sentence_starts, 'Sentence #'] = 'Sentence: ' + df.loc[sentence_starts, 'sentence_id'].astype(str) # 移除辅助列(可选) df = df.drop(columns=['separator_flag', 'sentence_id']) # 查看结果 print(df)
代码说明
df['Word'].isna().astype(int):将空行(Word为NaN)标记为1,用于识别句子分隔点。df['separator_flag'].cumsum():对分隔点进行累积计数,每遇到一个空行,计数加1,后续行自动归属到下一个句子。sentence_starts逻辑:通过shift(1)把分隔标记向上移动一行,第一行默认视为分隔点之后的行,确保第一个句子首行被标记;同时筛选非分隔行,避免给空行填充编号。- 最后仅给句子首行填充
Sentence: X格式的编号,其余行保持空字符串。
运行后即可得到符合要求的DataFrame结构。
内容的提问来源于stack exchange,提问作者R0manTic
相关产品推荐
相关产品推荐

