You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于行级动态条件对DataFrame列执行批量偏移修正?

解决方案:基于分组广播的DataFrame列修正

嘿,这个数据修正需求逻辑很清晰,本质就是按A列的111标识划分独立区间,给每个区间计算统一的修正差值后批量应用。用pandas可以高效实现,咱们一步步来:

1. 先构造示例数据

把你给出的测试数据转换成pandas DataFrame:

import pandas as pd

data = {
    'A': ['111', 'EF', 'DG', 'LK', '111', 'EF'],
    'B': [5.2, 5.6, 5.1, 5.4, 5, 5.2]
}
df = pd.DataFrame(data)

2. 核心处理逻辑

步骤1:生成分组ID

我们需要把每一段从111开始到下一个111前的行归为一个组,用cumsum()就能轻松实现分组标识的自动生成:

# 每当A列出现"111",分组ID就+1,自动划分出每个需要统一修正的区间
df['group_id'] = (df['A'] == '111').cumsum()

步骤2:计算分组修正差值

对每个分组,找到A=111对应的B值,计算5 - B作为该组的统一修正值,再通过transform把这个值广播到组内所有行:

# 给每个分组计算专属修正差值,并同步到组内每一行
df['diff'] = df.groupby('group_id')['B'].transform(
    lambda group: 5 - group[group.index[df.loc[group.index, 'A'] == '111'][0]]
)

步骤3:生成目标列C

用B列加上对应分组的修正差值,就能得到最终的C列:

df['C'] = df['B'] + df['diff']

3. 查看最终结果

运行上述代码后,提取A、B、C列查看:

print(df[['A', 'B', 'C']])

输出完全匹配你的需求:

A    B    C
0  111  5.2  5.0
1   EF  5.6  5.4
2   DG  5.1  4.9
3   LK  5.4  5.2
4  111  5.0  5.0
5   EF  5.2  5.2

额外优化:匹配示例的注释格式

如果需要把C列显示成示例里带注释的样式(比如5(减去0.2)),可以加一段字符串格式化的代码:

df['C_display'] = df.apply(
    lambda row: f"{row['C']}({'无需修改' if row['diff'] == 0 else f'减去{abs(row["diff"])}'})",
    axis=1
)

这样就能得到和你示例完全一致的展示效果啦。

内容的提问来源于stack exchange,提问作者FellowLuke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:08:55