如何使用含公式的key对Pandas DataFrame多列进行排序?
正确实现基于行级公式的DataFrame排序
你之前的写法报错是因为:当sort_values的by参数传入多个列名时,key函数会逐个接收每个列对应的Series(比如先传price列的Series,再传cost列的Series),而不是整个DataFrame。所以lambda里的x.price自然找不到属性——x是单个Series,不是带列名的DataFrame。
下面是两种可行的实现方式:
方法一:创建临时衍生列(直观易读)
先计算出排序用的price/cost比值列,直接按这个列排序,之后可以删掉临时列:
import pandas as pd import numpy as np df = pd.DataFrame({'name': ['x', 'y', 'z'], 'price': [1, 2, np.nan], 'cost': [3, np.nan, 1]}) # 计算价格成本比 df['price_cost_ratio'] = df['price'] / df['cost'] # 按比值排序(默认升序,ascending=False可改降序) df_sorted = df.sort_values(by='price_cost_ratio') # 可选:删除临时列 df_sorted = df_sorted.drop('price_cost_ratio', axis=1) print(df_sorted)
方法二:直接用key函数行级计算(无临时列)
如果不想额外创建列,可以直接让key函数对每一行进行计算,此时不需要指定by参数:
df_sorted = df.sort_values(key=lambda row: row['price'] / row['cost'])
关于NaN的处理
上述两种方法中,包含NaN的行计算出的比值也是NaN,默认会排在结果的最后。如果需要调整NaN的排序位置,可以用na_position参数:
# 把NaN排在最前面 df_sorted = df.sort_values(key=lambda row: row['price'] / row['cost'], na_position='first')
内容的提问来源于stack exchange,提问作者reservoirinvest
相关产品推荐
相关产品推荐

