【问题标题】:custom data sorting(alphabetic+integer) in pandas dataframe熊猫数据框中的自定义数据排序(字母+整数)
【发布时间】:2021-09-27 01:43:00
【问题描述】:

我有一个数据框,我需要对一列的内容进行排序(逗号分隔)(按字母顺序 + 数字):

输入:-

      Invoice Number
0     IN-2
1     IN-1
2     IN-5
3     IN-20
4     IN-10

我想要像这样的输出

      Invoice Number
0     IN-1
1     IN-2
2     IN-5
3     IN-10
4     IN-20

我试过了

df.sort_values(by=['Invoice Number'])

但它排序了:

      Invoice Number
0     IN-1
1     IN-10
2     IN-2
3     IN-20
4     IN-5

如果有人知道如何对我的数据(字母+整数)值进行排序,请告诉我。

【问题讨论】:

  • 在您的情况下,熊猫按列中的每个字符进行排序。一种选择是将字符串“IN-”与新列中的数字分开,然后使用数字对列进行排序。

标签: python pandas dataframe sorting


【解决方案1】:

您可以简单地使用sort_valueskey 选项:

df.sort_values(by='Number', key=lambda x: x.str[3:].astype(int))

它的作用是去掉“IN-”部分并转换为int。

【讨论】:

  • 所有行都没有 IN-xxx 它可能是 RHKW-xxx 或 AMH-xxx 字母表中的任何内容。
【解决方案2】:

尝试使用占位符列:

df['_'] = df['Invoice Number'].str.split('-').str[1].astype(int)
print(df.sort_values('_').drop('_', axis=1).reset_index(drop=True))

或者使用key 参数:

print(df.sort_values('Invoice Number', key=lambda x: x.str.split('-').str[1].astype(int))

两个代码输出:

  Invoice Number
0           IN-1
1           IN-2
2           IN-5
3          IN-10
4          IN-20

【讨论】:

  • lambda x: int(x.str[3:]) 不起作用,因为 x.str[3:] 是一个系列,而不是一个标量。
  • @mozway 我现在用的是split,和你的代码不一样,看看吧
  • 我正要添加拆分变体 ;)
  • 您也许可以评论一下,即使“-”之前的部分是可变的,拆分变体也可以工作
【解决方案3】:

natsort 在这些情况下很有帮助:

import pandas as pd
from natsort import natsort_key

df = pd.DataFrame({'Invoice': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4},
                   'Number': {0: 'IN-2', 1: 'IN-1', 2: 'IN-5', 3: 'IN-20',
                              4: 'IN-10'}})

df = df.sort_values('Number', key=natsort_key)

df:

   Invoice Number
1        1   IN-1
0        0   IN-2
2        2   IN-5
4        4  IN-10
3        3  IN-20

一个更有趣的例子:

df = pd.DataFrame({'Invoice': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4},
                   'Number': {0: 'RHKW-11', 1: 'AB-1', 2: 'IN-5', 3: 'IN-20',
                              4: 'RHKW-102'}})

df:

   Invoice    Number
0        0   RHKW-11
1        1      AB-1
2        2      IN-5
3        3     IN-20
4        4  RHKW-102

df = df.sort_values('Number', key=natsort_key):

   Invoice    Number
1        1      AB-1
2        2      IN-5
3        3     IN-20
0        0   RHKW-11
4        4  RHKW-102

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 2021-10-14
    • 2012-11-30
    • 2021-01-06
    • 2017-08-21
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多