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

基于提取的z值对DataFrame行内Column_2及以后列排序

问题描述

我有如下DataFrame:

Column_1Column_2Column_3Column_4
'0 0 1 apple''0 0 2 banana''7 5 6 orange''4 2 9 mango'
'2 8 0 grape''3 7 5 apple''7 4 1 banana''0 5 3 kiwi'
'3 8 4 lemon''5 0 7 grape''3 8 9 pineapple''6 1 8 watermelon'
'3 7 6 orange''0 1 8 lemon''1 6 7 cherry''2 9 0 raspberry'
'5 2 7 cherry''2 9 7 pear''NaN''NaN'

每个单元格的字符串格式为'x y z SomeText',需要固定Column_1保持不变,对每行的Column_2及后续列,根据字符串中的z值(第三个数字)重新排序,目标输出如下:

Column_1Column_2Column_3Column_4
'0 0 1 apple''4 2 9 mango''7 5 6 orange''0 0 2 banana'
'2 8 0 grape''3 7 5 apple''0 5 3 kiwi''7 4 1 banana'
'3 8 4 lemon''3 8 9 pineapple''6 1 8 watermelon''5 0 7 grape'

注:排序依据为z值降序,同时忽略NaN值。

解决方案

用Python的pandas库可以实现需求,具体代码如下:

import pandas as pd

# 构造原始DataFrame
data = {
    'Column_1': ["'0 0 1 apple'", "'2 8 0 grape'", "'3 8 4 lemon'", "'3 7 6 orange'", "'5 2 7 cherry'"],
    'Column_2': ["'0 0 2 banana'", "'3 7 5 apple'", "'5 0 7 grape'", "'0 1 8 lemon'", "'2 9 7 pear'"],
    'Column_3': ["'7 5 6 orange'", "'7 4 1 banana'", "'3 8 9 pineapple'", "'1 6 7 cherry'", "'NaN'"],
    'Column_4': ["'4 2 9 mango'", "'0 5 3 kiwi'", "'6 1 8 watermelon'", "'2 9 0 raspberry'", "'NaN'"]
}
df = pd.DataFrame(data)

def sort_row_by_z(row):
    # 提取Column_2及之后的列
    cols_to_sort = row[1:]
    # 过滤掉NaN值
    valid_cols = cols_to_sort[cols_to_sort != "'NaN'"]
    # 从字符串中提取z值作为排序键
    def get_z_value(s):
        parts = s.strip("'").split()
        return int(parts[2])
    # 按z值降序排序
    sorted_cols = sorted(valid_cols, key=get_z_value, reverse=True)
    # 补充缺失的NaN以保持列数一致
    sorted_cols += ["'NaN'"] * (len(cols_to_sort) - len(sorted_cols))
    # 拼接回Column_1和排序后的列
    return [row[0]] + sorted_cols

# 应用函数到每一行
sorted_df = df.apply(sort_row_by_z, axis=1, result_type='expand')
# 恢复原列名
sorted_df.columns = df.columns

# 输出结果
print(sorted_df)

代码说明

  1. 构造DataFrame:将原始数据转换为pandas的DataFrame结构,方便后续处理。
  2. 行处理函数:
    • 提取每行中Column_1之后的列数据;
    • 过滤掉标记为'NaN'的无效值;
    • 定义get_z_value函数,从单元格字符串中拆分出第三个数字作为排序依据;
    • 对有效列按z值降序排序,再补充缺失的'NaN'保证列数与原数据一致;
    • 将Column_1与排序后的列拼接,返回完整行数据。
  3. 应用并整理结果:用apply方法将处理函数作用到每一行,最后恢复原列名得到最终结果。

内容的提问来源于stack exchange,提问作者corvusMidnight

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:25:56