2017-03-22 57 views
2

就拿這個簡單的數據框:熊貓:數據幀排序按日期字符串無需轉換

df = pd.DataFrame({ 
    'date':['1/15/2017', '2/15/2017','10/15/2016', '3/15/2017'], 
    'int':[2,3,1,4] 
}) 

我想按照日期排序,然後將其保存到CSV,而無需:

  1. 使用pd.to_datetime(df['date'])
  2. 排序使用.sort_values('date')
  3. 轉換數據框轉換日期可以追溯到.strftime('%-m/%-d/%Y')

,而是做這樣的事情(當然,不工作):

df.apply(pd.to_dataframe(df['date']).sort_values(by = 'date', inplace = True) 

輸出:

  date kw 
2 10/15/2016 1 
0 1/15/2017 2 
1 2/15/2017 3 
3 3/15/2017 4 

這是可能的,或者我應該只是堅持使用3一步過程?

回答

2

numpyargsort返回必要進行排序的陣列排列。我們可以利用iloc。因此,通過使用pd.to_datetime轉換日期,然後獲取值並調用argsort,我們已經完成了我們所需的所有工作,以便對原始數據框進行排序而不更改任何列。

df.iloc[pd.to_datetime(df.date).values.argsort()] 

     date int 
2 10/15/2016 1 
0 1/15/2017 2 
1 2/15/2017 3 
3 3/15/2017 4 
+0

總是歡迎解釋。 –

+0

@ pshep123'argsort'是一個'np.array'方法,它返回一個可以對數組進行排序的索引數組。這被傳遞給'iloc',它根據* integer position *進行索引,在這種情況下,基於'argsort'返回的索引。這是一個非常整潔的解決方案! –

+0

@piRSquared - 感謝解決方案和解釋。 – pshep123

3

可以使用.assign()方法:

In [22]: df.assign(x=pd.to_datetime(df['date'])).sort_values('x').drop('x', 1) 
Out[22]: 
     date int 
2 10/15/2016 1 
0 1/15/2017 2 
1 2/15/2017 3 
3 3/15/2017 4 
+0

謝謝MaxU - 由於簡潔以及它不創建另一列的事實,我將使用piRSquared,但這很棒。 – pshep123

+0

@ pshep123,當然,我喜歡他的回答比我的更多 – MaxU

+0

我對這個解決方案很好奇,因爲我認爲它提供了更多的靈活性,以便包含日期以及日期(我知道我最初沒有問過) 。但我對速度也很好奇 - 當我以15分鐘的間隔運行20年(如此大概70萬條線)時,您的解決方案速度一直高出2倍以上。謝謝! – pshep123