如何按Pandas DataFrame某列值的出现频率排序?
按列值出现频率排序DataFrame
你之前的代码问题主要出在变量名混淆(把animal相关逻辑写成了tree类变量)和transform参数使用错误,以下是正确的实现方案:
方案一:添加频率列后排序
先计算每个动物名称的出现次数,映射到原DataFrame每行,再按频率排序:
import pandas as pd # 假设你的DataFrame已加载为animal_data # 1. 统计每个animal_name的出现次数 animal_counts = animal_data["animal_name"].value_counts() # 2. 给原DataFrame新增频率列 animal_data["freq"] = animal_data["animal_name"].map(animal_counts) # 3. 按频率降序排序,频率相同时可按动物名称排序(可选) sorted_animal_data = animal_data.sort_values(by=["freq", "animal_name"], ascending=[False, True]) # 不需要保留freq列可删除 sorted_animal_data = sorted_animal_data.drop(columns="freq")
方案二:用sort_values的key参数直接排序(更简洁)
借助sort_values的key参数,直接根据值的频率排序,无需额外加列:
sorted_animal_data = animal_data.sort_values( by="animal_name", key=lambda col: col.map(animal_data["animal_name"].value_counts()), ascending=False )
你之前代码的错误点
- 变量名混乱:误用
tree_data_copy、tree_type_name等无关变量,导致数据不匹配报错 - transform参数错误:传入的
"tree_type_counts"不是pandas支持的聚合函数,即便用transform,正确参数应为"count",但map方式更直接高效
最终输出的sorted_animal_data会符合预期:
animal_name 0 Dog 1 Dog 4 Dog 2 Cat 5 Cat 3 Fish
内容的提问来源于stack exchange,提问作者FJJ
相关产品推荐
相关产品推荐

