我已经搜索了这个论坛,但还没有找到解决我的问题的方法.我正在使用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相关问答推荐

替换Pandas中组下的列值

Python避免捕获特定异常

如何使用regex将电话号码和姓名从文本字符串中分离出来

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

基于其他列的条件向Panda数据框中添加值到新列

如何在带有 GUI 的 python 游戏中设置回答时间限制?

Python 解包运算符 (*)

Python过滤器函数 - 单个结果

python 3.4版不支持'ur'前缀

使用 pytest.fixture 返回模拟对象的正确方法

cv2 python 没有 imread 成员

Python3 的超级和理解-> TypeError?

无法在 Windows 8 中使用 Python 3.3 找到 vcvarsall.bat

用 numpy nan 查找列表的最大值

如何在 python 3.x 中禁用 ssl 判断?

Pruning in Keras

导入父目录进行简要测试

TypeError: write() 参数必须是 str,而不是字节(Python 3 vs Python 2)

为什么某些代码在 Python2 中是确定性的,而在 Python 3 中是非确定性的?

在动态链接库 Anaconda3\Library\bin\mkl_intel_thread.dll 中找不到序数 242