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
applystr.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