根据列值对数据框进行排序

时间:2021-01-01 08:32:03

标签: python pandas

我在数据框中的 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

这里有两件事:

  1. 9.10 被解释为我想要避免的 9.1
  2. 我希望 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,我没问题,但顺序应该相同。

PS:我没有指定任何列类型,因为我可以。我的目标是实现上面指定的两点。此列值实际上是我在数据框中加载并尝试按照我上面指定的顺序排序的目录名称。

3 个答案:

答案 0 :(得分:2)

您必须使用 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

可选

如果您不想保留列 num0num1,请将最后一行代码更改为:

df = df.sort_values(['num0','num1'])['col1']

您还可以使用以下命令重置数据帧索引:

df = df.reset_index(drop=True)

答案 1 :(得分:0)

<td>

答案 2 :(得分:0)

试试这个:

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(".")], )