Python 如何根据由字母和数字组成的列对dataframe进行排序?

Python 如何根据由字母和数字组成的列对dataframe进行排序?,python,pandas,dataframe,sorting,Python,Pandas,Dataframe,Sorting,我有这样一个数据帧: import pandas as pd df = pd.DataFrame( { 'pos': ['A1', 'B03', 'A2', 'B01', 'A3', 'B02'], 'ignore': range(6) } ) pos ignore 0 A1 0 1 A03 1 2 A2 2 3 B01 3 4 B3 4 5 B02

我有这样一个数据帧:

import pandas as pd

df = pd.DataFrame(
    {
        'pos': ['A1', 'B03', 'A2', 'B01', 'A3', 'B02'],
        'ignore': range(6)
    }
)
   pos  ignore
0   A1       0
1  A03       1
2   A2       2
3  B01       3
4   B3       4
5  B02       5
df[['let', 'num']] = df['pos'].str.extract(
    '([A-Za-z]+)([0-9]+)'
)
df['num'] = df['num'].astype(int)
df = (
    df.sort_values(['num', 'let'])
      .drop(['let', 'num'], axis=1)
      .reset_index(drop=True)
)
我想根据
pos
对其进行排序

  • 它应该先按数字排序,然后按字母和数字排序
  • 应忽略前导
    0
    s
因此,理想的结果是

   pos  ignore
0   A1       0
1  B01       3
2   A2       2
3  B02       5
4  A03       1
5   B3       4
我现在是这样做的:

import pandas as pd

df = pd.DataFrame(
    {
        'pos': ['A1', 'B03', 'A2', 'B01', 'A3', 'B02'],
        'ignore': range(6)
    }
)
   pos  ignore
0   A1       0
1  A03       1
2   A2       2
3  B01       3
4   B3       4
5  B02       5
df[['let', 'num']] = df['pos'].str.extract(
    '([A-Za-z]+)([0-9]+)'
)
df['num'] = df['num'].astype(int)
df = (
    df.sort_values(['num', 'let'])
      .drop(['let', 'num'], axis=1)
      .reset_index(drop=True)
)

这是可行的,但我不喜欢的是,我需要两个临时列,以后必须再次删除。有更直接的方法吗?

您可以使用
argsort
zfill
对数字进行第一次排序,如
01、02、03
等。这样您就不必分配/删除列:

val =  df['pos'].str.extract('(\D+)(\d+)')
df.loc[(val[1].str.zfill(2) + val[0]).argsort()]

   pos  ignore
0   A1       0
3  B01       3
2   A2       2
5  B02       5
4   A3       4
1  B03       1
这里有一个方法:

重新导入
def提取部件(x):
组=重新匹配('([A-Za-z]+)([0-9]+)',x)
返回(int(组[2]),组[1])
reindex(df.pos.transform(提取部分)。排序值().index)。重置索引(drop=True)
输出

Out[1]: 
   pos  ignore
0   A1       0
1  B01       3
2   A2       2
3  B02       5
4  A03       1
5   B3       4

我不认为您的方法有任何问题,因为任何其他方法都需要在内存中计算这些值。我同意@DataNearior您的方法对于一个问题来说非常简单,但事实并非如此。@DataNearior:好的,谢谢您的评论。我只是想在不需要临时列的地方介绍它们,所以我想在这里再次检查:)@Erfan:好的,谢谢你的评论。我只是想在不需要的地方引入临时列,所以我想在这里再次检查:)这是一个很好的列。唯一的问题是我必须知道
zfill
(也可以大于2)的数字,但我想我可以在
pos
中使用字符串的最大长度。是的,
df['pos'].str.len().max()-1
也可以正常工作,谢谢。我需要检查
sort\u值
如何在元组上工作;似乎它首先根据第一个条目进行排序,然后根据第二个条目进行排序(
(3,A)
(3,B)
之前结束)。@Cleb您对基于元组排序的理解是正确的。不客气。