Python中识别DataFrame同公司代码并按排序号删除冗余行的方法
实现方案
核心逻辑说明
你需要先将主交易数据表和同公司多代码映射表关联,再按公司维度分组处理,符合规则的同公司代码仅保留Final Sorted Number最大的条目,其余删除。
完整代码实现
import pandas as pd # ---------- 1. 构造测试数据(实际使用时替换为你的真实数据即可)---------- # 主交易数据表(你已经计算完Final Sorted Number的结果) df = pd.DataFrame({ 'Code': ['ApplA', 'Amazon', 'Facebook', 'ApplE'], 'Volume': [500, 1000, 250, 100], 'Trade': [1000, 500, 750, 1500], 'Volume Order': [2, 1, 3, 4], 'Trade Order': [2, 4, 3, 1], 'Max Ordered Number': [2, 4, 3, 4], 'Final Sorted Number': [4, 2, 3, 1] }) # 同公司多代码映射表 df_samecompanies = pd.DataFrame({ 'Codes': ['ApplA', 'Amazon', 'Facebook', 'ApplE', 'AmazA', 'AmazonB'], 'Code': ['Apple', 'Amazon', 'Facebook', 'Apple', 'Amazon', 'Amazon'], 'Shares': ['A', 'Empty', 'Empty', 'E', 'A', 'B'] }) # ---------- 2. 关联两张表,补充公司、股份后缀信息 ---------- df = df.merge( df_samecompanies[['Codes', 'Code', 'Shares']], left_on='Code', right_on='Codes', how='left', suffixes=('', '_company') ).rename(columns={'Code_company': 'Company'}) # 重命名避免列名冲突 # ---------- 3. 按公司分组过滤,删除不符合要求的条目 ---------- def filter_same_company(group): # 该公司只有1个代码,直接保留 if len(group) == 1: return group # 该公司有多个代码,且存在后缀为A/D的条目 if any(group['Shares'].isin(['A', 'D'])): # 保留Final Sorted Number最大的1条,其余删除 return group.nlargest(1, 'Final Sorted Number', keep='first') # 其他无A/D后缀的同公司代码场景,可自行补充规则,这里默认全部保留 return group # 执行分组过滤,重置索引 df_result = df.groupby('Company', group_keys=False).apply(filter_same_company).reset_index(drop=True) # ---------- 4. 删除临时关联列,得到最终结果 ---------- df_result = df_result.drop(columns=['Codes', 'Company', 'Shares']) print(df_result)
输出结果验证
处理后会自动删除Final Sorted Number更小的ApplE,最终结果如下:
Code Volume Trade Volume Order Trade Order Max Ordered Number Final Sorted Number 0 ApplA 500 1000 2 2 2 4 1 Amazon 1000 500 1 4 4 2 2 Facebook 250 750 3 3 3 3
内容的提问来源于stack exchange,提问作者Bianconera
相关产品推荐
相关产品推荐

