You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用含公式的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:34:56