背景:物料清单(BOM)进行数据清洗时,在BOM表中按照父编码进行分组,保留QTY最大且失效时间最晚的一行,删除其余的行。
关键点:按照多列排序、分组、删除每分分组中排序不在第一位的。涉及函数
df.sort_values((by=['col1', 'col2', 'col3'],
ascending=[True, False, False])) #按照多列排序
df_sorted.groupby(['col']).head(1) # 分组
df_sorted.index.isin(reserved_indices) # 根据索引筛选行
解决办法:
import pandas as pd
# 创建一个示例DataFrame
data = {'PITEM': ['A0001', 'B0001', 'C0001', 'B0001', 'D0001','D0001'],
'TYPE': ['BUY', 'BUY', 'BUY', 'BUY', 'MAKE', 'MAKE'],
'QTY': [1, 0.4, 1, 0.6, 0.2, 0.8],
'DISABLE_PERIOD': [5, 4, 6, 5, 7, 8],
}
df = pd.DataFrame(data)
# 按照多列排序
df_sorted = df.sort_values(by=['PITEM', 'QTY', 'DISABLE_PERIOD'],
ascending=[True, False, False])
# 分组,并得到每个分组中排序最大的索引
reserved_indices = df_sorte