如何在Pandas中删除与同DataFrame内M标记行多列匹配的行
问题:删除同netting分组下与M标记行数据重复的非M行
需求明确:在包含netting字段的DataFrame里,删掉所有Total、first、second列值和同netting分组内标记为M的行完全一致的非M行。
示例数据与初始DataFrame
import pandas as pd data = { 'netting': ['01', '01', '01', '01', '01', '02', '02'], 'Total': [9358.66, 9358.66, 9358.66, 9358.66, 9358.66, 100.00, 100.00], 'first': [358.69, 358.69, 358.69, 358.69, 358.69, 100.00, 100.00], 'second': [9717.35, 717.35, 9717.35, 9717.35, 9717.35, 100.00, 100.00], 'lable': ['M', 'X', 'X', 'X', 'X', 'M', 'Y'] } df = pd.DataFrame(data)
初始DataFrame输出:
netting Total first second lable 0 01 9358.66 358.69 9717.35 M 1 01 9358.66 358.69 717.35 X 2 01 9358.66 358.69 9717.35 X 3 01 9358.66 358.69 9717.35 X 4 01 9358.66 358.69 9717.35 X 5 02 100.00 100.00 100.00 M 6 02 100.00 100.00 100.00 Y
解决方案代码
# 提取每个netting分组中lable为M的行的关键列数据,作为参考模板 m_templates = df[df['lable'] == 'M'].set_index('netting')[['Total', 'first', 'second']] # 合并模板到原DataFrame,方便对比 df_with_template = df.merge(m_templates, on='netting', suffixes=('', '_m')) # 标记需要删除的行:非M行,且三个关键列和模板完全一致 to_drop = (df_with_template['lable'] != 'M') & \ (df_with_template['Total'] == df_with_template['Total_m']) & \ (df_with_template['first'] == df_with_template['first_m']) & \ (df_with_template['second'] == df_with_template['second_m']) # 过滤得到最终结果 final_df = df[~to_drop].reset_index(drop=True) print(final_df)
最终输出结果
netting Total first second lable 0 01 9358.66 358.69 9717.35 M 1 01 9358.66 358.69 717.35 X 2 02 100.00 100.00 100.00 M
步骤解释
- 先提取每个netting分组里的M行数据,作为该分组的"基准数据"
- 将基准数据合并回原表,让每一行都能和同组的基准数据做对比
- 筛选出非M行且三个关键列全与基准匹配的行,标记为待删除
- 反向筛选保留不需要删除的行,得到目标结果
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

