Pandas如何从n_1~n_3列提取大于0值排序生成new_1~new_3列?
实现DataFrame行内正数值排序填充的正确方案
你原来的代码本身就有语法错误:axis=1的行遍历模式下,apply传入的lambda接收参数是整行的Series对象,不能直接定义a/b/c三个入参,也缺少必要的逗号分隔,逻辑也完全没实现筛选、排序、补0的需求,自然会报错。
正确实现逻辑
每行的处理规则:
- 提取
n_1、n_2、n_3三列的数值 - 过滤掉所有小于等于0的值
- 对剩余数值做升序排序
- 不足3个的位置统一补0,返回长度固定为3的序列赋值给三个新列
可直接运行的代码
import pandas as pd # 自定义行处理函数 def process_row(row): # 筛选正数值并升序排序 positive_vals = sorted([val for val in row[['n_1', 'n_2', 'n_3']] if val > 0]) # 补0至长度为3 positive_vals += [0.0] * (3 - len(positive_vals)) return pd.Series(positive_vals, index=['new_1', 'new_2', 'new_3']) # 应用到原DataFrame df[['new_1', 'new_2', 'new_3']] = df.apply(process_row, axis=1)
注:你给出的预期输出里有部分数值和输入示例不匹配(比如ID为143419025的行预期new_2出现了输入没有的13.78、ID为143419030的行输入n1、n3都是0,预期里出现了3.92、11.23,属于输入示例笔误,上述代码逻辑完全符合你描述的需求)
内容的提问来源于stack exchange,提问作者chuky pedro
相关产品推荐
相关产品推荐

