我可以使用“from __future__ import”来克服pandas中“sort”的API更改吗?

时间:2017-09-22 19:49:52

标签: python pandas sorting

排序功能上的pandas API已从pandas版本17更改为现在,因此您现在需要使用df.sort_values而不是df.sort

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

由于某些原因,我需要在具有不同pandas版本的计算机上运行相同的代码。

有没有办法使用from __future__ import语句以“sort”或“sort_values”与两个pandas版本一起使用的方式修改下面的代码?

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 个答案:

答案 0 :(得分: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")   

答案 1 :(得分:1)

最好的解决方案可能是拥有一个模块,在不同版本的库之上导出公开相同接口的函数。

例如,参见六个人做的事:https://github.com/IdentityModel/IdentityModel2/blob/dev/README.md

在这个具体示例中,您可以执行以下操作:

档案: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版本,只需删除模块中的条件。

你甚至可以做更复杂的事情,例如。反向移植功能(但要小心!以这种方式出售大量的库可能不是最好的主意):

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