Pandas如何不创建额外列按多列和对DataFrame排序
问题描述
首先执行如下代码,分别对出口数据集exp、进口数据集imp按country字段分组对value求和后合并,重命名列得到包含country、export_to、import_from三个字段的DataFrame:
grouped1=exp.groupby("country")["value"].sum().reset_index() grouped2=imp.groupby("country")["value"].sum().reset_index() grouped=grouped1.merge(grouped2,on="country") grouped.rename(columns={"value_x":"export_to","value_y":"import_from"},inplace=True) grouped
运行输出:
核心需求:按照export_to和import_from两列的和对该DataFrame排序,且不创建额外的辅助列。
尝试过的错误写法:
grouped.sort_values(grouped.export_to+grouped.import_from)
该写法无法得到正确的排序结果。
解决方案
错误原因:sort_values()的by参数默认接收列名字符串或列名字符串列表作为输入,直接传入两列求和得到的Series对象时,方法会将Series内的数值当作列名去原DataFrame中匹配,根本找不到对应列,自然无法返回正确排序结果。
正确实现代码:
pandas的sort_values()方法的by参数支持传入可调用对象,该可调用对象会接收待排序的DataFrame作为输入,返回一维的排序键值,全程不会在原DataFrame中生成额外辅助列,完全符合需求:
- 按两列之和升序排序:
# 若需要直接修改原DataFrame,加上inplace=True参数即可 grouped.sort_values(by=lambda df: df["export_to"] + df["import_from"], inplace=True)
- 按两列之和降序排序:
grouped.sort_values(by=lambda df: df["export_to"] + df["import_from"], ascending=False, inplace=True)
内容的提问来源于stack exchange,提问作者beridzeg45
相关产品推荐
相关产品推荐

