如何基于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)
效果示例
假设你的原始数据是这样的:
| Sales | Code | _$ | _c |
|---|---|---|---|
| Alice | Big | 10 | 50 |
| NaN | NaN | 0 | 0 |
| Bob | Small | 20 | 30 |
| NaN | NaN | 0 | 0 |
| Charlie | Big | 15 | 25 |
| NaN | NaN | 0 | 0 |
| NaN | NaN | 0 | 0 |
处理后的结果会变成:
| Sales | Code | _$ | _c | Dollars | Cents |
|---|---|---|---|---|---|
| Alice | Big | 10 | 50 | 10 | 50 |
| NaN | NaN | 0 | 0 | 10 | 50 |
| Bob | Small | 20 | 30 | 20 | 30 |
| NaN | NaN | 0 | 0 | ||
| Charlie | Big | 15 | 25 | 15 | 25 |
| NaN | NaN | 0 | 0 | 15 | 25 |
| NaN | NaN | 0 | 0 | 15 | 25 |
完全符合你的需求:Big时持续填充到下一次Sale出现,Small时只作用于当前行,而且原始数据集完全没被修改~
内容的提问来源于stack exchange,提问作者user9394674
相关产品推荐
相关产品推荐

