Python 如何更改列值并使用pandas进行排序?

Python 如何更改列值并使用pandas进行排序?,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据框 import pandas as pd df = pd.read_csv('filename.csv') print(df) cat A B C 0 cat1 0.787575 0.159330 0.053095 1 cat10 0.770698 0.169487 0.059815 2 cat11 0.792689 0.152043 0.055268 3

我有以下数据框

import pandas as pd
df = pd.read_csv('filename.csv')

print(df)

     cat      A         B           C
0     cat1    0.787575  0.159330    0.053095
1     cat10   0.770698  0.169487    0.059815
2     cat11   0.792689  0.152043    0.055268
3     cat12   0.785066  0.160361    0.054573
4     cat13   0.795455  0.150464    0.054081
5     cat14   0.794873  0.150700    0.054426
..    ....
8     cat19   0.811585  0.140207    0.048208
9     cat2    0.797202  0.152033    0.050765
10    cat20   0.801607  0.145137    0.053256
11    cat21   0.792689  0.152043    0.055268
    ....
显然,
cat1
的顺序不正确,因为
cat2
应该在
cat1
之后,而不是
cat19
之后

有什么方法可以纠正这种情况

我的想法是重新标记每个单个数字
cat
,然后使用
.sort()
进行排序。然而,我这样做的方法不起作用

df = df.rename(index={'cat1': 'cat01'})
df = df.rename(index={'cat2': 'cat02'})
df = df.rename(index={'cat3': 'cat03'})
...
df = df.rename(index={'cat9': 'cat09'})
似乎必须将索引更改为
cat
列,然后使用上述方法进行排序

然而,我还是打字太多了。实现这一目标的最佳方式是什么

我认为您可以使用:


您可以使用正则表达式来提取数字(
\d+
表示一个或多个数字),使用来对它们进行零填充,然后将
cat
添加回结果。我已经将
3
用于
zfill
,因此
1
变成
001
。你可以根据自己的需要来调整

我还创建了一个掩码,仅将其应用于有数字的行

np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))
df['cat'] = ['catZ', 'cat10', 'cat11', 'cat12', 'cat13']

digit_str = df.cat.str.extract(r'(\d+)').str.zfill(3)
mask = digit_str.notnull()
df.loc[mask, 'cat'] = 'cat' + digit_str[mask]

>>> df
          A         B         C     cat
0  1.764052  0.400157  0.978738    catZ
1  2.240893  1.867558 -0.977278  cat010
2  0.950088 -0.151357 -0.103219  cat011
3  0.410599  0.144044  1.454274  cat012
4  0.761038  0.121675  0.443863  cat013

有一只猫名叫
catZ
。不幸的是,使用上述方法,这将转换为一个
NaN
,通过新的编辑,您将
catZ
擦除为
cat0
@ShanZhengYang。它在上面的示例中工作,您认为为什么会导致
catZ
cat0
?有一只猫名为
catZ
。不幸的是,使用上述方法,这将转换为
cat0Z
。我想首先检查
cat
后面是否有一个数字?我首先检查字符串的
length
,如果是
4
而不是
catZ
apply
str.zfill
df.loc[(df.cat.str.len() == 4) & 
       (df.cat != 'catZ'), 'cat'] =  'cat' + df.cat.str[-1].str.zfill(2)
print df
      cat         A         B         C
0   cat01  0.787575  0.159330  0.053095
1   cat10  0.770698  0.169487  0.059815
2   cat11  0.792689  0.152043  0.055268
3   cat12  0.785066  0.160361  0.054573
4   cat13  0.795455  0.150464  0.054081
5   cat14  0.794873  0.150700  0.054426
8   cat19  0.811585  0.140207  0.048208
9   cat02  0.797202  0.152033  0.050765
10  cat20  0.801607  0.145137  0.053256
11   catZ  0.792689  0.152043  0.055268
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))
df['cat'] = ['catZ', 'cat10', 'cat11', 'cat12', 'cat13']

digit_str = df.cat.str.extract(r'(\d+)').str.zfill(3)
mask = digit_str.notnull()
df.loc[mask, 'cat'] = 'cat' + digit_str[mask]

>>> df
          A         B         C     cat
0  1.764052  0.400157  0.978738    catZ
1  2.240893  1.867558 -0.977278  cat010
2  0.950088 -0.151357 -0.103219  cat011
3  0.410599  0.144044  1.454274  cat012
4  0.761038  0.121675  0.443863  cat013