2017-05-04 22 views
2

我有一個數據幀的列名是時間(0:00,0:10,0:20,...,23:50)。現在,它們按照字符串順序排序(所以0:00是第一個,9:50是最後一個),但我想在時間之後對它們進行排序(所以0:00是第一個,23:50是最後一個)。sort_values()與Python中的鍵

如果時間是一列,你可以使用

df = df.sort(columns='Time',key=float) 

但是1),只有工作,如果時間是列本身,而不是列名,和2)排序()是不贊成使用,所以我嘗試棄用它。

我試圖使用

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()就沒有關鍵的參數!

+1

請出示一些示例數據。 – zipa

+0

'df [sorted(df,key = pd.to_datetime)]'應該這樣做。 – Abdou

+0

Abdou:您的解決方案給出了一個錯誤: OutOfBoundsDatetime:出界納秒時間戳:1-01-01 00:00:00 –

回答

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 

我希望這有助於

+0

我想確保這個工作時間比如'9:10',並且確實如此。在發佈這個問題之前,我做了很多google,所以我很驚訝我沒有遇到sorted()函數。 –

2

只需將前導零到一位數小時即可。這應該是最簡單的解決方案,因爲您可以簡單地進行詞法排序。

E.g. 5:30 - > 05:30。

+0

打破列名稱,提取一位數字的小時數,預先設置一個零,並用新的前綴替換列名似乎不是一個非常流暢的解決方案。 –

+0

您不必實際更改數據。你可以使用一個尊重這個的排序函數,即在排序的(cmp = x)上從pandas調用reindex_axis,其中x排序關於隱含的前導零的數據。這基本上只是檢查第三個字符是否是冒號。我懷疑你可以讓它更有效率。任何轉換例程必定會更昂貴。 –

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 
+0

這也適用,但我認爲Abdou的解決方案更清潔。 –