基于提取的z值对DataFrame行内Column_2及以后列排序
问题描述
我有如下DataFrame:
| Column_1 | Column_2 | Column_3 | Column_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_1 | Column_2 | Column_3 | Column_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)
代码说明
- 构造DataFrame:将原始数据转换为pandas的DataFrame结构,方便后续处理。
- 行处理函数:
- 提取每行中
Column_1之后的列数据; - 过滤掉标记为
'NaN'的无效值; - 定义
get_z_value函数,从单元格字符串中拆分出第三个数字作为排序依据; - 对有效列按z值降序排序,再补充缺失的
'NaN'保证列数与原数据一致; - 将
Column_1与排序后的列拼接,返回完整行数据。
- 提取每行中
- 应用并整理结果:用
apply方法将处理函数作用到每一行,最后恢复原列名得到最终结果。
内容的提问来源于stack exchange,提问作者corvusMidnight
相关产品推荐
相关产品推荐

