如何自动化实现DataFrame条件行删除与值拆分
实现大型DataFrame的自动化分类处理需求
需求概述
需要对大型DataFrame执行以下自动化操作:
- 删除
categories字段值不在指定分类列表list_cat中的行 - 将被删除行的
Value字段值,拆分到同LOAD_ID_VR分组下的其他符合分类要求的行中
示例说明
指定分类列表:
list_cat = ['FREIGHT CHARGES', 'PETROL', 'ADDITIONAL STOP', 'OTHERS', 'TOLL', 'DANGEROUS GOODS']
输入DataFrame片段:
import pandas as pd # 模拟输入数据 data = { 'LOAD_ID_VR': ['19082022121669VR00158480']*3, 'Status': ['To correct']*3, 'Status_2': ['pass']*3, 'Claim Amount': [pd.NA]*3, 'Indicator': ['Adjustment Freight Charges', 'Ajustment Petrol Diff', 'Ajustment Manual Rate Diff'], 'Value': [-625.00, -41.45, 333.23], 'categories': ['FREIGHT CHARGES', 'PETROL', 'MANUAL RATE'] } df_pivot = pd.DataFrame(data)
期望输出:MANUAL RATE不在分类列表中,对应的行被删除,其Value(333.23)平均拆分到另外两行:
| LOAD_ID_VR | Status | Status_2 | Claim Amount | Indicator | Value | categories |
|---|---|---|---|---|---|---|
| 19082022121669VR00158480 | To correct | pass | Adjustment Freight Charges | -458.335 | FREIGHT CHARGES | |
| 19082022121669VR00158480 | To correct | pass | Ajustment Petrol Diff | 125.215 | PETROL |
实现方案
完全可以通过Pandas的分组(groupby)操作实现该需求,以下是具体代码:
import pandas as pd # 1. 定义分类列表 list_cat = ['FREIGHT CHARGES', 'PETROL', 'ADDITIONAL STOP', 'OTHERS', 'TOLL', 'DANGEROUS GOODS'] def process_group(group): # 分离有效行和无效行 valid_rows = group[group['categories'].isin(list_cat)] invalid_rows = group[~group['categories'].isin(list_cat)] # 计算无效行的Value总和 invalid_total = invalid_rows['Value'].sum() if len(valid_rows) == 0: # 如果分组内没有有效行,直接返回空(可根据需求调整) return pd.DataFrame() # 2. 拆分逻辑:示例采用平均拆分,也可替换为按Value绝对值比例拆分 # 平均拆分:将无效总和平均分配到每一行 split_amount = invalid_total / len(valid_rows) valid_rows['Value'] = valid_rows['Value'] + split_amount # 可选:按Value绝对值比例拆分 # abs_total = valid_rows['Value'].abs().sum() # valid_rows['Value'] = valid_rows['Value'] + (invalid_total * valid_rows['Value'].abs() / abs_total) return valid_rows # 3. 按LOAD_ID_VR分组处理,并合并结果 processed_df = df_pivot.groupby('LOAD_ID_VR', group_keys=False).apply(process_group) # 重置索引(可选) processed_df = processed_df.reset_index(drop=True)
关键说明
- 分组处理逻辑:通过
groupby('LOAD_ID_VR')将数据按分组隔离,确保拆分仅在同组内进行 - 拆分规则:代码默认采用平均拆分,若需要按比例(如有效行Value的绝对值占比)拆分,可注释掉平均拆分代码,启用比例拆分的代码块
- 边界处理:如果某分组内没有有效行,直接返回空DataFrame,可根据实际需求调整该逻辑(如保留无效行或做其他处理)
内容的提问来源于stack exchange,提问作者Pedro Gomes
相关产品推荐
相关产品推荐

