首页 > 解决方案 > (Pandas) 正确的 lambda 表达式按值@索引位置 1 对列进行排序

问题描述

我正在尝试SrcWell按值的索引位置 1 进行排序。我知道有一个关键字参数key,其行为类似于 in keysorted但是在尝试使用key. 这是一个要作为 pandas DataFrame 加载的示例 CSV 文件:

SrcPlate            SrcWell
PS000000123456      A4
PS000000123456      B7
PS000000123456      A7
PS000000123456      H6
PS000000123456      G6  
PS000000123456      F6

SrcWell还有一个按其数值排序的小脚本:

import pandas as pd

worklist = pd.read_csv('worklist.csv')
print(worklist.sort_values(by="SrcWell", key=lambda x: int(x[1])))

>>> [...] ValueError: invalid literal for int() with base 10: 'B7'

标签: pythonpython-3.xpandasnumpy

解决方案


尝试使用 .str 访问器和切片:

df.sort_values(by="SrcWell", key=lambda x: x.str[1])

输出:

         SrcPlate SrcWell
0  PS000000123456      A4
3  PS000000123456      H6
4  PS000000123456      G6
5  PS000000123456      F6
1  PS000000123456      B7
2  PS000000123456      A7

正如@Ben.T 指出的,根据文档

key :可调用,可选
在排序之前将 key 函数应用于值。这类似于内置 sorted() 函数中的 key 参数,但显着的区别是这个 key 函数应该是矢量化的。它应该期望一个系列并返回一个与 输入具有相同形状的系列。它将独立应用于 by 中的每一列。


推荐阅读