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