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

如何基于Pandas DataFrame的Code列扩展Sales关联值填充逻辑

解决思路与代码实现

嗨,这个需求刚好可以用Pandas的分组结合条件填充来搞定,全程不会修改你的原始数据集,我给你一步步讲清楚怎么实现:

1. 先复制原始数据集,避免修改源数据

首先我们要做的就是把原DataFrame复制一份,所有操作都在副本上进行:

import pandas as pd

# 假设你的原始数据集是df,先复制一份
df_processed = df.copy()

2. 标记锚点行并生成分组

我们需要先把所有Sales列有值的行标记出来(这些是我们的"锚点"行),然后给每个锚点到下一个锚点之间的行分配同一个分组ID:

# 标记哪些行是Sales有值的锚点行
df_processed['is_sale'] = df_processed['Sales'].notna()

# 生成分组ID:每个分组包含一个锚点行,以及到下一个锚点行之前的所有行
df_processed['group_id'] = df_processed['is_sale'].cumsum()

3. 初始化填充列

先按照你原来的逻辑,给锚点行的Dollars和Cents列赋值,其他行先设为缺失值:

# 初始化Dollars列:只有Sales非空的行,把_$的值填进去
df_processed['Dollars'] = df_processed.apply(
    lambda x: x['_$'] if pd.notna(x['Sales']) else pd.NA,
    axis=1
)

# 同理初始化Cents列
df_processed['Cents'] = df_processed.apply(
    lambda x: x['_c'] if pd.notna(x['Sales']) else pd.NA,
    axis=1
)

4. 按分组实现条件填充

接下来就是核心逻辑:对每个分组判断锚点行的Code值,如果是Big就把锚点的填充值向下覆盖整个分组;如果是Small就只保留锚点行的填充值,其他行恢复缺失:

def process_group(group):
    # 获取当前分组锚点行的Code值(分组的第一行就是锚点行)
    anchor_code = group.iloc[0]['Code']
    
    if anchor_code == 'Big':
        # Big规则:把锚点的Dollars和Cents值填充到整个分组的所有行
        group['Dollars'] = group['Dollars'].ffill()
        group['Cents'] = group['Cents'].ffill()
    else:
        # Small规则:只保留锚点行的填充值,其他行设为缺失
        group.loc[group.index != group.index[0], ['Dollars', 'Cents']] = pd.NA
    
    return group

# 对每个分组应用处理逻辑
df_processed = df_processed.groupby('group_id').apply(process_group)

# 最后可以把临时的辅助列删掉(可选,看你需求)
df_processed = df_processed.drop(['is_sale', 'group_id'], axis=1)

效果示例

假设你的原始数据是这样的:

SalesCode_$_c
AliceBig1050
NaNNaN00
BobSmall2030
NaNNaN00
CharlieBig1525
NaNNaN00
NaNNaN00

处理后的结果会变成:

SalesCode_$_cDollarsCents
AliceBig10501050
NaNNaN001050
BobSmall20302030
NaNNaN00
CharlieBig15251525
NaNNaN001525
NaNNaN001525

完全符合你的需求:Big时持续填充到下一次Sale出现,Small时只作用于当前行,而且原始数据集完全没被修改~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:04:46