如何基于Pandas DataFrame现有列筛选大于0值排序生成新列
实现方案
你之前的代码问题是没有过滤小于等于0的数值就直接排序,调整后有两种实现方式可选:
1. 易读性优先(适合小数据量)
逐行筛选大于0的数值排序后补0,逻辑清晰易修改:
def process_row(row): # 提取当前行n_1~n_3中所有大于0的数 valid_nums = [x for x in row if x > 0] # 从小到大排序后补0到3个元素 valid_nums.sort() return valid_nums + [0] * (3 - len(valid_nums)) df[['new_1', 'new_2', 'new_3']] = df[['n_1', 'n_2', 'n_3']].apply( process_row, axis=1, result_type='expand' )
2. 性能优先(适合10万行以上大数据量)
用numpy向量化操作避免行遍历,效率提升10倍以上:
import numpy as np # 将小于等于0的数值替换为nan n_arr = df[['n_1', 'n_2', 'n_3']].where(df[['n_1', 'n_2', 'n_3']] > 0).values # 按行排序,nan会自动排在末尾 sorted_arr = np.sort(n_arr, axis=1) # 将末尾的nan替换为0 df[['new_1', 'new_2', 'new_3']] = np.nan_to_num(sorted_arr, nan=0)
注:你提供的预期输出中存在两处笔误:143419025行的new_2应为2.63、143419030行原始n_1/n_3为0,正确输出new_1应为40、new_2/new_3为0,上述代码输出会匹配修正后的正确逻辑。
内容的提问来源于stack exchange,提问作者chuky pedro
相关产品推荐
相关产品推荐

