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
对其进行排序
- 它应该先按数字排序,然后按字母和数字排序
- 应忽略前导
s0
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您对基于元组排序的理解是正确的。不客气。