2017-09-22 82 views
0

上的排序功能的大熊貓API已經從熊貓版17上改變,因此現在你需要使用df.sort_values而不是df.sort我可以使用「from __future__ import」來克服pandas中「排序」的API更改嗎?

https://pandas.pydata.org/pandas-docs/stable/whatsnew.html#whatsnew-0170-api-breaking

由於種種原因,我需要在運行相同的代碼有不同熊貓版本的機器。

有沒有辦法修改下面的代碼,使用from __future__ import聲明來對「排序」或「排序值」與兩個熊貓版本兼容?

import pandas as pd 

df = pd.DataFrame([1,7,5], columns=["A"]) 
print df 

df=df.sort_values("A")  # from pandas version 17 on 
# df=df.sort("A")   # prior to pandas version 17 
print df 
+2

是否有一個嘗試除了塊不會工作的原因? – bphi

+3

'__future__'導入是爲了更改Python語言本身,而不是更改庫。 – user2357112

+0

@ user2357112謝謝,我認爲這是正確的答案,反映了我的誤解。 – tfv

回答

1

類似bphi的評論,你可以嘗試使用的if/else:

#print(pd.__version__.split('.')) 
#output: ['0', '20', '2'] 
# using an or statement here just in case you need to ultra-future-proof 
# will check if version is above 0.x.x or greater than 0.17.0 

if int(pd.__version__.split('.')[1]) > 17 or int(pd.__version__.split('.')[0] > 0): 
    df=df.sort_values("A") 
else: 
    df=df.sort("A") 

然而,在try/except塊以及(信貸bphi這一個):

try: 
    df.sort_values("A") 
except YOUR_ERROR_HANDLING_HERE: 
# technically it is an AttributeError: 
    df.sort("A") 
+0

雖然我意識到這一點:-),但這並不是我正在尋找的東西,但它仍然是一個正確的答案。 – tfv

+0

小心 - ''sort_values()'*可能會引發'AttributeError'(當然,這取決於函數)。所以try..except版本需要類似於: def get_sort_values() : 嘗試: 返回df.sort_values ,除AttributeError: 返回df.sort – redShadow

+0

縮進在評論中丟失了,但我希望這個觀點很清楚 – redShadow

1

最好的解決方案可能是在不同版本的庫之上有一個模塊,導出公開相同接口的函數。

例如,見什麼6作用:https://github.com/benjaminp/six

在這個具體的例子,你可以這樣做:

文件:compat.py

import pandas as pd # I guess.. 
# You also need to import "df", of course.. 

# Note that version numbers might be more complex than this 
pandas_version = tuple(map(int, pd.__version__.split('.'))) 

if pandas_version > (0, 17): 
    sort_values = df.sort_values 
else: 
    sort_values = df.sort 

這種方式,從代碼的其餘部分,你可以只需from yourlib.compat import sort_values

一旦你不再需要支持版本0.17,只需在模塊中刪除條件。

你甚至可以做更復雜的事情,例如。 backporting函數(小心雖然!vendoring大塊的圖書館這種方式可能不是最好的主意):

if pandas_version > (0, 50): # Or whatever 
    some_func = pd.some_func 
else: 
    def some_func(): 
     pass # Copied from the newer version 
相關問題