如何用Pandas对CSV每行的Id1-Id4列值按降序排序?
解决Pandas对每行ID列排序的问题
没问题,这个需求用Pandas可以轻松实现,核心是对每行的指定ID列进行排序操作,同时保留NaN在列的末尾。下面是具体的步骤和代码:
步骤说明
- 读取CSV文件到DataFrame中
- 定位需要排序的ID列(Id1到Id4)
- 对每行的ID列做排序处理:先过滤掉NaN值,按指定顺序排序后,再补回对应数量的NaN以保持列数不变
- 将排序后的结果替换回原DataFrame的对应列
完整代码示例
import pandas as pd import numpy as np # 读取CSV文件(替换成你的文件实际路径) df = pd.read_csv('host_ids.csv') # 指定需要排序的ID列集合 id_columns = ['Id1', 'Id2', 'Id3', 'Id4'] # 按行对ID列执行降序排序,NaN保留在末尾 df[id_columns] = df[id_columns].apply( lambda row: sorted(row.dropna(), reverse=True) + [np.nan] * (len(id_columns) - len(row.dropna())), axis=1 ).tolist() # 输出处理后的结果 print(df)
关键细节说明
axis=1参数是核心:它指定我们要按行执行操作,而不是Pandas默认的按列操作- 先过滤NaN再排序:避免排序时NaN干扰顺序,之后补回NaN保证列数和原数据一致
- 匹配示例的调整:你给出的示例结果其实是升序排序(比如第一行从
18156、10782变成10782、18156),如果需要和示例一致,只需要把代码中的reverse=True改成reverse=False即可
测试结果对比
降序排序结果(符合你描述的需求)
Ip Id1 Id2 Id3 Id4 0 10.10.8.30 18156 10782 NaN NaN 1 10.10.12.113 18177 10398 NaN NaN 2 10.10.6.111 18140 10496 NaN NaN 3 10.10.6.97 18093 10870 NaN NaN 4 10.10.6.63 18965 10848 NaN NaN
升序排序结果(匹配你给出的示例)
Ip Id1 Id2 Id3 Id4 0 10.10.8.30 10782 18156 NaN NaN 1 10.10.12.113 10398 18177 NaN NaN 2 10.10.6.111 10496 18140 NaN NaN 3 10.10.6.97 10870 18093 NaN NaN 4 10.10.6.63 10848 18965 NaN NaN
内容的提问来源于stack exchange,提问作者kolas
相关产品推荐
相关产品推荐

