我在数据帧中有列col1
,其值如下:
col1 col2 col3
9.1
9.1
9.11
9.12
9.13
9.14
9.15
9.16
9.2
9.3
9.4
9.5
9.6
9.7
9.8
9.9
10.1
10.1
10.2
10.3
是否可以根据col1
值对数据帧进行如下排序:
col1 col2 col3
9.1
9.2
9.3
9.4
9.5
9.6
9.7
9.8
9.9
9.10
9.11
9.12
9.13
9.14
9.15
9.16
10.1
10.1
10.2
10.3
这里有两件事:
9.10
被解释为我想要避免的9.1
- 我希望
9.10
按排序顺序出现在9.9
之后
下面是示例代码:
>>> import pandas as pd
>>> pd.DataFrame([9.1,9.7,9.8,9.9,9.10,10.0,10.1,10.2,10.11])
0
0 9.10
1 9.70
2 9.80
3 9.90
4 9.10
5 10.00
6 10.10
7 10.20
8 10.11
>>> df.sort_values(0)
0
0 9.10
4 9.10
1 9.70
2 9.80
3 9.90
5 10.00
6 10.10
8 10.11
7 10.20
我希望它是:
0
0 9.1
1 9.7
2 9.8
3 9.9
4 9.10
5 10.0
6 10.1
7 10.2
8 10.11
如果它像9.70
一样在小数点后显示两位数,我可以,但顺序应该相同。
附言:我没有指定任何列类型,因为我可以指定任何列。我的目标是达到上述两点。这些列值实际上是我正在数据帧中加载的目录名,并试图按照上面指定的顺序进行排序。
您必须使用str
数据创建数据帧(我随机打乱了它(:
data = ['9.1', '10.1', '10.2', '10.11', '9.8', '10.0', '9.10', '9.7', '9.9']
df = pd.DataFrame(data, columns = ['col1'])
# col1
#0 9.1
#1 10.1
#2 10.2
#3 10.11
#4 9.8
#5 10.0
#6 9.10
#7 9.7
#8 9.9
现在,您可以拆分列:
new = df['col1'].str.split('.', expand = True)
# 0 1
#0 9 1
#1 10 1
#2 10 2
#3 10 11
#4 9 8
#5 10 0
#6 9 10
#7 9 7
#8 9 9
将new
列添加到df
中,并按照它们进行排序。记住"new"包含"str"实例,因此可以将它们强制转换为int
,以便比较值(以便对数据帧进行排序(:
df['num0'] = new[0].astype(int)
df['num1'] = new[1].astype(int)
df = df.sort_values(['num0','num1'])
# col1 num0 num1
#0 9.1 9 1
#7 9.7 9 7
#4 9.8 9 8
#8 9.9 9 9
#6 9.10 9 10
#5 10.0 10 0
#1 10.1 10 1
#2 10.2 10 2
#3 10.11 10 11
可选
如果您不想保留列num0
和num1
,请将最后一行代码更改为:
df = df.sort_values(['num0','num1'])['col1']
您还可以使用重置数据帧索引
df = df.reset_index(drop=True)
df.col1 = df.col1.astype(float)
df = df.sort_values(by='col1')
试试这个:
data = [9.1, 9.1, 9.11, 9.12, 9.13, 9.14, 9.15, 9.16,9.2,9.3,9.4,9.5,9.6,9.7,9.8,9.9,10.1,10.1,10.2,10.3,]
df = pd.DataFrame([[i,"",""] for i in data], columns=["col1", "col2", "col3"]).astype("str")
df.sort_values(by=['col1'], key=lambda x: [(int(i[0]), int(i[-1])) for i in x.str.split(".")], )