pandas 如何对一个 Dataframe 进行排序,其中一列是整数,每行是字符串和整数?

mnemlml8  于 2023-04-28  发布在  其他
关注(0)|答案(3)|浏览(150)

如何对以下dataframe进行排序:

df = pd.DataFrame({'a':['abc_1.2.6','abc_1.2.60','abc_1.2.7','abc_1.2.9','abc_1.3.0','abc_1.3.10','abc_1.3.100','abc_1.3.11'], 'b':[1,2,3,4,5,6,7,8]})

>>>
    a           b
0   abc_1.2.6   1
1   abc_1.2.60  2
2   abc_1.2.7   3
3   abc_1.2.9   4
4   abc_1.3.0   5
5   abc_1.3.10  6
6   abc_1.3.100 7
7   abc_1.3.11  8

以实现这一输出?

>>>
    a           b
0   abc_1.2.6   1
1   abc_1.2.7   3
2   abc_1.2.9   4
3   abc_1.2.60  2
4   abc_1.3.0   5
5   abc_1.3.10  6
6   abc_1.3.11  8
7   abc_1.3.100 7

我知道字符串中的整数可以通过字符串转换来访问,但是我不确定如何在数据框架中处理这个问题,显然df.sort_values(by=['a'],ignore_index=True)在这种情况下是没有帮助的。

carvr3hs

carvr3hs1#

一种使用方法是natsortediloc

#pip install natsort
from natsort import natsorted
​
out = df.iloc[natsorted(range(len(df)), key=lambda x: df.loc[x, "a"])]

或者更短,如@Stef所建议的,使用natsort_key作为sort_values的键:

from natsort import natsort_key

out = df.sort_values(by="a", key=natsort_key, ignore_index=True)

输出:

print(out)
             a  b
0    abc_1.2.6  1
1    abc_1.2.7  3
2    abc_1.2.9  4
3   abc_1.2.60  2
4    abc_1.3.0  5
5   abc_1.3.10  6
6   abc_1.3.11  8
7  abc_1.3.100  7
hmae6n7t

hmae6n7t2#

您可以在排序之前对值应用key函数:

df = (df.sort_values(by=['a'], ignore_index=True,
                     key=lambda x: x.map(lambda v:
                                         tuple(map(int, v[4:].split('.'))))))
a  b
0    abc_1.2.6  1
1    abc_1.2.7  3
2    abc_1.2.9  4
3   abc_1.2.60  2
4    abc_1.3.0  5
5   abc_1.3.10  6
6   abc_1.3.11  8
7  abc_1.3.100  7
wgeznvg7

wgeznvg73#

下面是使用str.findall()explode()的另一种方法

df.sort_values('a',key = lambda x: x.str.findall(r'\d+').explode().astype(int).groupby(level=0).agg(tuple))

输出:

a  b
0    abc_1.2.6  1
2    abc_1.2.7  3
3    abc_1.2.9  4
1   abc_1.2.60  2
4    abc_1.3.0  5
5   abc_1.3.10  6
7   abc_1.3.11  8
6  abc_1.3.100  7

相关问题