排序功能上的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