如何为Pandas DataFrame绑定前后行数据(按文档句索引处理)
Pandas实现按文档分组的前后行数据绑定
嗨,我来帮你搞定这个数据处理需求!核心思路是按文档(doc)分组后,对目标列进行上下行偏移(shift)操作,同时处理好文档内首/末句的边界填充问题,具体步骤如下:
1. 先构造正确的输入DataFrame
你提供的基础创建代码和示例数据不符,先还原你需要的输入数据:
import pandas as pd # 构造示例输入DataFrame data = { 'doc': [0, 0, 0, 1, 1], 'sent': [0, 1, 2, 0, 1], 'col1': [5, 6, 1, 6, 5], 'col2': [4, 3, 2, 1, 1], 'col3': [8, 2, 9, 6, 5] } df = pd.DataFrame(data)
2. 定义目标列并生成前后行数据
我们针对col1/col2/col3这三列,按doc分组后分别生成上一行(前缀p_)和下一行(前缀n_)的数据,空值用0填充:
# 指定需要处理的目标列 target_cols = ['col1', 'col2', 'col3'] # 生成上一行数据:每个文档内向下偏移1行,空值(文档首句)填0,并重命名列 prev_data = df.groupby('doc')[target_cols].shift(1).fillna(0).rename(columns=lambda x: f'p_{x}') # 生成下一行数据:每个文档内向上偏移1行,空值(文档末句)填0,并重命名列 next_data = df.groupby('doc')[target_cols].shift(-1).fillna(0).rename(columns=lambda x: f'n_{x}')
3. 合并所有数据得到最终结果
把原DataFrame和前后行数据按列拼接:
result_df = pd.concat([df, prev_data, next_data], axis=1)
运行后你会得到符合预期的结果,如果需要把浮点型的0转成整数,可以加一步类型转换:
result_df[prev_data.columns.tolist() + next_data.columns.tolist()] = result_df[prev_data.columns.tolist() + next_data.columns.tolist()].astype(int)
最终输出就和你给出的示例完全一致了:
doc sent col1 col2 col3 p_col1 p_col2 p_col3 n_col1 n_col2 n_col3 0 0 0 5 4 8 0 0 0 6 3 2 1 0 1 6 3 2 5 4 8 1 2 9 2 0 2 1 2 9 6 3 2 6 1 6 3 1 0 6 1 6 0 0 0 5 1 5 4 1 1 5 1 5 6 1 6 0 0 0
内容的提问来源于stack exchange,提问作者Christopher Costello
相关产品推荐
相关产品推荐

