Pandas按name_column分组取percentual前5行报KeyError如何解决
错误原因
- 你的
colunas列表存储的是name_column列的取值,而非当前处理的DataFrame的列名。当前DataFrame仅包含Company、name_column、total_parcial、percentual四个列,直接用df[colunas]检索不存在的列自然触发KeyError - 原有逻辑混淆了列名和列取值,
nlargest的排序依据应该是percentual列而非coluna里的维度名称
修复方案
方案1:更简洁的分组实现(推荐)
直接通过分组取每组Top5,无需手动迭代:
import pandas as pd # 若仅需要处理colunas列表内指定的name_column取值,先加一步过滤 df_filtered = df_company_top_percent[df_company_top_percent['name_column'].isin(colunas)] # 按name_column分组,每组取percentual最高的5行,合并为新DataFrame result = df_filtered.groupby('name_column', group_keys=False)\ .apply(lambda df_group: df_group.nlargest(5, 'percentual'))\ .reset_index(drop=True)
方案2:和原有迭代逻辑对齐的实现
如果你需要保留循环写法,修改如下即可:
import pandas as pd lista4 = [] # 直接迭代colunas列表,不要套df[] for coluna in colunas: # 先筛选当前name_column对应的数据,再取percentual最高的5行 group_df = df_company_top_percent[df_company_top_percent['name_column'] == coluna] top5 = group_df.nlargest(5, 'percentual') lista4.append(top5) # 合并所有分组的Top5结果 result = pd.concat(lista4, ignore_index=True)
两种方案输出的result就是符合要求的目标DataFrame。
内容的提问来源于stack exchange,提问作者Tom AL
相关产品推荐
相关产品推荐

