Python 以一种不同寻常的方式对熊猫的两列进行排序
我有这样一个数据框:Python 以一种不同寻常的方式对熊猫的两列进行排序,python,pandas,Python,Pandas,我有这样一个数据框: col_1 | serial_number | remaining time B | 17 | 02:45 A | 02 | 02:00 C | 25 | 03:30 A | 03 | 03:00 B | 12 | 03:45 C | 07 | 01:30 C |
col_1 | serial_number | remaining time
B | 17 | 02:45
A | 02 | 02:00
C | 25 | 03:30
A | 03 | 03:00
B | 12 | 03:45
C | 07 | 01:30
C | 89 | 02:30
B | 45 | 01:45
A | 01 | 01:00
我想按剩余时间排序(最短的在顶部),但col_1应该分组。下面是上面的数据帧的样子
col_1 | serial_number | remaining time
A | 01 | 01:00
A | 02 | 02:00
A | 03 | 03:00
C | 07 | 01:30
C | 89 | 02:30
C | 25 | 03:30
B | 45 | 01:45
B | 17 | 02:45
B | 12 | 03:45
我现在不能做这件事。首先,我需要按剩余时间排序,然后将colu_1分组 您可以使用
创建一个新列,该列对于每个元素都具有其组中任何成员的最短时间
接下来,正如jdehesa在评论中所建议的,您可以使用
df.sort_values(['remaining_time_group_min', 'remaining time'])
创建
数据帧
:
import pandas as pd
df = pd.DataFrame({'col_1':['B','A','C','A','B','C','C','B','A'], 'serial_number':[17,2,25,3,12,7,89,45,1],'remaining time':['02:45','02:00','03:30','03:00','03:45','01:30','02:30','01:45','01:00']})
df['remaining time'] = pd.to_datetime(df['remaining time'])
df['remaining time'] = [time.time() for time in df['remaining time']]
添加一个新列,其中包含每个组的最短时间:
df['min time'] = df.groupby('col_1')['remaining time'].transform(min)
然后按新的最短时间排序,然后按实际剩余时间排序:
>>> df.sort_values(by=['min time','remaining time'])
col_1 remaining time serial_number min time
8 A 01:00:00 1 01:00:00
1 A 02:00:00 2 01:00:00
3 A 03:00:00 3 01:00:00
5 C 01:30:00 7 01:30:00
6 C 02:30:00 89 01:30:00
2 C 03:30:00 25 01:30:00
7 B 01:45:00 45 01:45:00
0 B 02:45:00 17 01:45:00
4 B 03:45:00 12 01:45:00
创建列列1
并排序:
cats = df.sort_values(['remaining time'])['col_1'].unique()
print (cats)
['A' 'C' 'B']
df['col_1'] = pd.Categorical(df['col_1'], categories=cats, ordered=True)
df = df.sort_values([ 'col_1', 'remaining time'])
print (df)
col_1 serial_number remaining time
8 A 01 01:00
1 A 02 02:00
3 A 03 03:00
5 C 07 01:30
6 C 89 02:30
2 C 25 03:30
7 B 45 01:45
0 B 17 02:45
4 B 12 03:45
详细信息:
print (df['col_1'])
8 A
1 A
3 A
5 C
6 C
2 C
7 B
0 B
4 B
Name: col_1, dtype: category
Categories (3, object): [A < C < B]
打印(df['col_1'])
8 A
1A
3A
5 C
6 C
2 C
7 B
0 B
4 B
名称:col_1,数据类型:类别
类别(3,对象):[A
对值进行排序(['col\u 1','remain\u time'])然后你需要什么?你能解释一下groupby
在哪里应用到你的数据吗?@jdehesa然后它会先对'col\u 1'进行排序。按顺序排列成“A”、“B”、“C”。我需要先检查剩余时间,然后分组“col_1”together@grubjesic我认为这确实是一个错误,我正在编辑它out@jdoe为什么在最后的数据帧中17比45早?它们都有B
,但在剩余时间内未排序。这个解决方案对我来说似乎最简单!非常感谢。
print (df['col_1'])
8 A
1 A
3 A
5 C
6 C
2 C
7 B
0 B
4 B
Name: col_1, dtype: category
Categories (3, object): [A < C < B]