对包含数字和字符串的列进行数字排序(pandas/python)
我必须对第1列和第2列上的数据帧进行排序;第1列包含数字和文本,应首先对其进行数字排序。在excel中,这是排序的标准方式,但在pandas中则不是。。我在熊猫手册中找不到多少关于如何做到这一点的信息 所以这个数据帧:对包含数字和字符串的列进行数字排序(pandas/python),python,sorting,pandas,Python,Sorting,Pandas,我必须对第1列和第2列上的数据帧进行排序;第1列包含数字和文本,应首先对其进行数字排序。在excel中,这是排序的标准方式,但在pandas中则不是。。我在熊猫手册中找不到多少关于如何做到这一点的信息 所以这个数据帧: Z 762320 296 1 Z 861349 297 0 1 865545 20 20 1 865584 297 0 22 865625 297 0 2 865628 292 5 10 865662 297 0 1 865665 2
Z 762320 296 1
Z 861349 297 0
1 865545 20 20
1 865584 297 0
22 865625 297 0
2 865628 292 5
10 865662 297 0
1 865665 296 0
11 865694 293 1
1 865700 297 0
10 866429 297 0
11 866438 297 0
应该是:
1 865545 20 20
1 865584 297 0
1 865665 296 0
1 865700 297 0
2 865628 292 5
10 865662 297 0
10 866429 297 0
11 865694 293 1
11 866438 297 0
22 865625 297 0
Z 762320 296 1
Z 861349 297 0
当我进行df.sort([0,1])时,我得到:
你是说第0列和第1列吗
>>> df.sort([0, 1])
0 1 2 3
2 1 865545 20 20
3 1 865584 297 0
7 1 865665 296 0
9 1 865700 297 0
5 2 865628 292 5
6 10 865662 297 0
10 10 866429 297 0
8 11 865694 293 1
11 11 866438 297 0
4 22 865625 297 0
0 Z 762320 296 1
1 Z 861349 297 0
[更新]
如果数据不是数字(所有元素都是字符串),则会发生这种情况
字符串排序是预期的结果:
>>> df.sort([0, 1])
0 1 2 3
2 1 865545 20 20
3 1 865584 297 0
7 1 865665 296 0
9 1 865700 297 0
6 10 865662 297 0
10 10 866429 297 0
8 11 865694 293 1
11 11 866438 297 0
5 2 865628 292 5
4 22 865625 297 0
0 Z 762320 296 1
1 Z 861349 297 0
首先尝试转换值:
>>> def convert(v):
...: try:
...: return int(v)
...: except ValueError:
...: return v
>>> pandas.DataFrame([convert(c) for c in l] for l in df.values)\
.sort([0, 1])
0 1 2 3
2 1 865545 20 20
3 1 865584 297 0
7 1 865665 296 0
9 1 865700 297 0
5 2 865628 292 5
6 10 865662 297 0
10 10 866429 297 0
8 11 865694 293 1
11 11 866438 297 0
4 22 865625 297 0
0 Z 762320 296 1
1 Z 861349 297 0
有什么区别?元素现在是数字的:
>>> pandas.DataFrame([convert(c) for c in l] for l in df.values)\
.sort([0, 1]).values
array([[1.0, 865545.0, 20.0, 20.0],
[1.0, 865584.0, 297.0, 0.0],
[1.0, 865665.0, 296.0, 0.0],
[1.0, 865700.0, 297.0, 0.0],
[2.0, 865628.0, 292.0, 5.0],
[10.0, 865662.0, 297.0, 0.0],
[10.0, 866429.0, 297.0, 0.0],
[11.0, 865694.0, 293.0, 1.0],
[11.0, 866438.0, 297.0, 0.0],
[22.0, 865625.0, 297.0, 0.0],
['Z', 762320.0, 296.0, 1.0],
['Z', 861349.0, 297.0, 0.0]], dtype=object)
我编辑了我的帖子,说我没有得到那个结果;列0根据字符串排序。
>>> def convert(v):
...: try:
...: return int(v)
...: except ValueError:
...: return v
>>> pandas.DataFrame([convert(c) for c in l] for l in df.values)\
.sort([0, 1])
0 1 2 3
2 1 865545 20 20
3 1 865584 297 0
7 1 865665 296 0
9 1 865700 297 0
5 2 865628 292 5
6 10 865662 297 0
10 10 866429 297 0
8 11 865694 293 1
11 11 866438 297 0
4 22 865625 297 0
0 Z 762320 296 1
1 Z 861349 297 0
>>> pandas.DataFrame([convert(c) for c in l] for l in df.values)\
.sort([0, 1]).values
array([[1.0, 865545.0, 20.0, 20.0],
[1.0, 865584.0, 297.0, 0.0],
[1.0, 865665.0, 296.0, 0.0],
[1.0, 865700.0, 297.0, 0.0],
[2.0, 865628.0, 292.0, 5.0],
[10.0, 865662.0, 297.0, 0.0],
[10.0, 866429.0, 297.0, 0.0],
[11.0, 865694.0, 293.0, 1.0],
[11.0, 866438.0, 297.0, 0.0],
[22.0, 865625.0, 297.0, 0.0],
['Z', 762320.0, 296.0, 1.0],
['Z', 861349.0, 297.0, 0.0]], dtype=object)