如何在Pandas中按指定规则处理DataFrame并更新ColD
Pandas实现指定行筛选与ColD计算逻辑
先给出原始数据:
import pandas as pd df = pd.DataFrame({ 'ColA': [1, 2, 3, 11111, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9], 'ColB': [11, 5, 22, 66, 4, 33333, 45, 91, 78, 10, 17, 55, 73, 85, 56, 99, 4, 74], 'ColC': ['A', 'B', 'X', 'C', 'D', 'X', 'E', 'F', 'G', 'A', 'B', 'X', 'C', 'D', 'X', 'E', 'F', 'G'], 'ColD': [0,0,0,0,0, 22222,0,0,0,0,0,48,0,0,52,0,0,0] })
实现步骤:
- 保留有效行范围:只保留第一个
X到最后一个X之间的所有行,去掉首尾无效部分
# 获取所有ColC等于'X'的行索引 x_positions = df[df['ColC'] == 'X'].index # 切片筛选:从第一个X到最后一个X的所有行 df = df.loc[x_positions[0]:x_positions[-1]] # 重置索引(方便后续按索引操作,可选) df = df.reset_index(drop=True) # 重新获取筛选后数据中X的位置 x_positions = df[df['ColC'] == 'X'].index
- 遍历相邻X对,计算并更新ColD
# 遍历每一对相邻的X(从第1组到倒数第1组) for idx in range(len(x_positions)-1): # 前一个X的下一行索引 next_row_after_prev_x = x_positions[idx] + 1 # 获取Y:前一个X下一行的ColA值 y_value = df.loc[next_row_after_prev_x, 'ColA'] # 获取Z:后一个X所在行的ColB值 z_value = df.loc[x_positions[idx+1], 'ColB'] # 计算Z-Y,赋值给后一个X对应的ColD df.loc[x_positions[idx+1], 'ColD'] = z_value - y_value
验证结果
运行后df['ColD']会完全匹配目标结果:
- 第二个X的ColD:
33333 - 11111 = 22222 - 第三个X的ColD:
55 - 7 = 48 - 第四个X的ColD:
56 - 4 = 52
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

