pandas中Index.reindex()传入fill_value参数报错的问题咨询
pandas中Index.reindex()传入fill_value参数报错的问题咨询
嘿,我发现你遇到的问题根源是混淆了不同pandas对象的reindex方法参数!
你查的是DataFrame.reindex()的文档,这个方法确实支持fill_value参数,但你现在调用的是Index.reindex()(因为a和b都是DatetimeIndex对象),而Index类的reindex方法根本没有fill_value这个参数,所以才会抛出TypeError。
不过别担心,有两种简单的办法可以实现你想要的“把匹配不到的位置替换成NaN”的需求:
方法一:手动处理reindex返回的匹配数组
Index.reindex()会返回两个值:重新索引后的新索引,以及原索引在新索引中的位置数组(-1表示没有匹配到)。我们只需要把数组里的-1替换成NaN就行:
import pandas as pd import numpy as np a = pd.DatetimeIndex(["2000", "2001", "2002", "2003", "2004", "2005", "2009", "2010"]) b = pd.DatetimeIndex(["2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008", "2009", "2010"]) # 获取reindex的结果 new_idx, match_indices = a.reindex(b) # 将-1替换为NaN match_indices = np.where(match_indices == -1, np.nan, match_indices) print(match_indices)
运行后会得到:[ 0. 1. 2. 3. 4. 5. nan nan nan 6. 7.],正是你想要的结果。
方法二:把Index转换成Series再使用reindex
Series的reindex方法支持fill_value参数,我们可以先把原Index转换成带位置索引的Series,再重新索引:
import pandas as pd import numpy as np a = pd.DatetimeIndex(["2000", "2001", "2002", "2003", "2004", "2005", "2009", "2010"]) b = pd.DatetimeIndex(["2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008", "2009", "2010"]) # 将a转换为Series,值为原索引的位置 a_series = pd.Series(range(len(a)), index=a) # 用Series的reindex,指定fill_value为NaN result_series = a_series.reindex(b, fill_value=np.nan) # 提取值数组 match_indices = result_series.values print(match_indices)
这个方法也能得到和上面一样的结果,而且更贴近你原本想用fill_value的思路。
总结一下:以后调用pandas方法前,要注意确认当前对象的类型,不同类型的同名方法参数可能不一样哦~
备注:内容来源于stack exchange,提问作者Kernel
相关产品推荐
相关产品推荐

