我已经搜索了这个论坛,但还没有找到解决我的问题的方法.我正在使用Pandas 数据帧,我需要按两个属性对该列进行排序,该列的类型为字符串,因为它是字母数字,长度是首先的,然后是字母数字.输入将如下所示:

input = [10, 100110, 222754430, 777000, TEST10, 800022110, 210, 1960, 30, TERM20, 22100, 22300, 487854750, TEST20, 2200010, 220, 20, 22200, 1100, 2200020]

output = [10, 20, 30, 210, 220, 1100, 1960, 22100, 22200, 22300, TERM20, TEST10, TEST20, 100110, 777000, 2200010, 2200020, 222754430, 487854750, 800022110]

如果有人能帮忙,那就太好了!可以提供任何额外的信息

我try 了按长度排序,部分有效,但不完全有效.我也try 了SORT_VALUES,但它的排序方式类似于:10、100110、210、220、777000等.

推荐答案

我希望我没弄错你的问题.您可以try :

lst = [
    10,
    100110,
    222754430,
    777000,
    "TEST10",
    800022110,
    210,
    1960,
    30,
    "TERM20",
    22100,
    22300,
    487854750,
    "TEST20",
    2200010,
    220,
    20,
    22200,
    1100,
    2200020,
]


def key_fn(val):
    if isinstance(val, str):
        return len(val), False, val
    else:
        s = str(val)
        return len(s), True, s

output = sorted(lst, key=key_fn)
print(output)

打印:

[
    10,
    20,
    30,
    210,
    220,
    1100,
    1960,
    22100,
    22200,
    22300,
    "TERM20",
    "TEST10",
    "TEST20",
    100110,
    777000,
    2200010,
    2200020,
    222754430,
    487854750,
    800022110,
]

编辑:要将其应用于框架,您可以执行以下操作:

def key_fn(series):
    def __to_int(val):
        try:
            return int(val)
        except:
            return val

    def __inner(val):
        val = __to_int(val)

        if isinstance(val, str):
            return len(val), False, val
        else:
            s = str(val)
            return len(s), True, s

    return pd.Series([__inner(val) for val in series], index=series.index)


df = df.sort_values(by=["column1"], key=key_fn)
print(df)

打印:

      column1
0          10
16         20
8          30
6         210
15        220
18       1100
7        1960
10      22100
17      22200
11      22300
9      TERM20
4      TEST10
13     TEST20
1      100110
3      777000
14    2200010
19    2200020
2   222754430
12  487854750
5   800022110

Python-3.x相关问答推荐

math. gcd背后的算法是什么,为什么它是更快的欧几里得算法?

使用Python装载. iso文件

安装grpcio时出现错误DeproationWarning:pkg_resource

具有多个值的极轴旋转和熔化/取消旋转(反转旋转)操作(Pandas 堆叠/取消堆叠交替/UDF覆盖)

从另一个云函数调用带有仅允许内部流量标志的云函数时出现问题

如何在类中的函数(以 self 作为第一个参数)中使用递归

有没有一种方法可以通过输入从 0 到 255 的 R、G 和 B 值来生成 RGB colored颜色 ,而无需使用 python 中的 matplotlib 模块?

Pandas 窗口聚合两个排序表

attrs 将 list[str] 转换为 list[float]

如何在 Python 中 cv2 的窗口标题上动态更新 FPS

正则表达式来识别用 Python 写成单词的数字?

Python defaultdict 在获取时返回 None,尽管使用默认值初始化

TimescaleDB:是否可以从 Python 调用create_hypertable?

ValueError:找不到子字符串,我做错了什么?

Pandas 的 EMA 与股票的 EMA 不匹配?

如何在 Python3 中添加带有标志的命令行参数?

迭代器也是可迭代的吗?

无论如何我可以在 Google colaboratory 中下载文件吗?

在 Alembic 迁移期间更新列内容

使用 asyncio 的多个循环