我有一个数据框,其中列名是次(0:00,0:10,0:20,...,23:50)。现在,它们按照字符串顺序排序(所以0:00是第一个,9:50是最后一个)但是我想在时间之后对它们进行排序(因此0:00是第一个,23:50是最后一个)。
如果时间是一列,您可以使用
df = df.sort(columns='Time',key=float)
但是1)仅当 time 是一个列本身而不是列名时才有效,并且2)不推荐使用sort(),所以我尝试不使用它。
我正在尝试使用
df = df.sort_index(axis = 1)
但由于列名是字符串格式,因此它们会根据字符串键进行排序。我试过了
df = df.sort_index(key=float, axis=1)
但是会出现错误消息:
Traceback (most recent call last):
File "<ipython-input-112-5663f277da66>", line 1, in <module>
df.sort_index(key=float, axis=1)
TypeError: sort_index() got an unexpected keyword argument 'key'
有没有人有关于如何解决这个问题的想法?那个烦恼的sort_index() - 和sort_values()就此而言 - 没有关键参数!!
答案 0 :(得分:2)
只需将前导零加到一位数小时。这应该是最简单的解决方案,因为您可以简单地按词汇排序。
E.g。 5:30 - &gt; 05:30。
答案 1 :(得分:2)
尝试使用sorted
内置函数对列进行排序,并将输出传递给数据帧以进行索引。以下内容应作为一个工作示例:
import pandas as pd
records = [(2, 33, 23, 45), (3, 4, 2, 4), (4, 5, 7, 19), (4, 6, 71, 2)]
df = pd.DataFrame.from_records(records, columns = ('0:00', '23:40', '12:30', '11:23'))
df
# 0:00 23:40 12:30 11:23
# 0 2 33 23 45
# 1 3 4 2 4
# 2 4 5 7 19
# 3 4 6 71 2
df[sorted(df,key=pd.to_datetime)]
# 0:00 11:23 12:30 23:40
# 0 2 45 23 33
# 1 3 4 2 4
# 2 4 19 7 5
# 3 4 2 71 6
我希望这会有所帮助
答案 2 :(得分:2)
这是一个工作演示,它实现了@MartinKrämer's idea:
import re
In [259]: df
Out[259]:
23:40 0:00 19:19 12:30 09:00 11:23
0 33 2 1 23 12 45
1 4 3 1 2 13 4
2 5 4 1 7 14 19
3 6 4 1 71 14 2
In [260]: df.rename(columns=lambda x: re.sub(r'^(\d{1})\:', r'0\1:', x)).sort_index(axis=1)
Out[260]:
00:00 09:00 11:23 12:30 19:19 23:40
0 2 12 45 23 1 33
1 3 13 4 2 1 4
2 4 14 19 7 1 5
3 4 14 2 71 1 6
答案 3 :(得分:0)
我知道这个问题已经有几年了,但由于它是这个问题的顶级 Google 搜索结果,我想提供错误的根本原因。
'key' 参数在 1.1.0 版本中被添加到 sort_values。请参阅下面链接的文档中的注释。
如果您升级到 1.1.0 或更高版本,此功能将非常像您预期的那样工作。