2017-05-04 11 views
2

私は、列名が時間(0:00、0:10、0:20、...、23:50)であるデータフレームを持っています。今は、文字列順にソートされているので(0:00が最初、9:50が最後)、時間の経過後にソートしたいので(0:00が最初、23:50が最後です)。Pythonのキーを持つsort_values()

時間あなたは

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

を使用することができ、列である。しかし時間ではなく列名よりも、列そのものであり、かつ2)ソート(1の場合)にのみ動作する)である場合私はそれを使用しないようにします。

私は

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 [ソート済み(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をたくさんしていたので、ソートされた()関数に遭遇しなかったことに驚いています。 –

2

先行する0桁から1桁の時間だけを先頭に付けます。これは単純な解決策でなければなりません。

など。 5:30 - > 05:30

+0

カラム名を壊したり、1桁の時間を抽出したり、ゼロを前に付けたり、カラム名を新しいプリペンドのものに置き換えたりするのは非常に滑らかな解決策ではないようです。 –

+0

データを実際に変更する必要はありません。 sorted(cmp = x)のpandasからreindex_axisを呼び出します。ここで、xは暗黙の先頭ゼロに関連するデータをソートします。これは、基本的に、3番目の文字がコロンかどうかを確認することに過ぎません。私はあなたがそれをより効率的にすることができるとは思わない。どの変換ルーチンもより高価になる。 –

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のソリューションはよりクリーンですと思います。 –

関連する問題