我可以使用"from __future__ import"来克服熊猫中"sort"的 API 更改吗?



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

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

由于某些原因,我需要在带有不同熊猫版本的机器上运行相同的代码。

是否有一种方法可以使用from __future__ import语句来修改下面的代码,以"排序"或" sort_values"与两个熊猫版本一起使用?

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

类似于BPHI的评论,您可以尝试使用/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/drak block除外(该块归功于BPHI):

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

最好的解决方案可能是在库的不同版本的基础上具有单个模块,导出相同接口的函数。

例如,请参见六个做什么: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,只需摆脱模块中的条件。

您甚至可以做更多复杂的事情,例如。向后运动功能(虽然要小心!供应图书馆的大部分方式,这可能不是最大的想法):

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

最新更新