为什么reindex_like(s,method ='ffill')与reindex_like(s).fillna(method ='ffill')不同

时间:2020-06-03 09:07:14

标签: python pandas

我正尝试用另一个系列的索引重新索引一个系列,并填充缺失的值。

具有 Name Age order 0 Tom 20 1 1 nick 21 2 2 nick 19 2 3 jack 18 3 4 shiv 21 4 5 shiv 22 4 6 jim 23 5 1.0.3版的演示:

pandas

我期望两种方法的结果相同,为什么它们的行为有所不同?

1 个答案:

答案 0 :(得分:1)

第一个选项(s1.reindex_like(s2).fillna(method='ffill'))首先进行重新索引,保留空(NaN)的值,然后再填充它们。

reindex_like返回[1]:

s1.reindex_like(s2)
6    [6,inf)
2        NaN
5        NaN
0      [0,1)
4      [4,6)
7        NaN
1      [1,3)
3      [3,4)
dtype: object

现在,您看到fillna(method='ffill')按照在这里排序的序列的顺序向前填充(即,沿着未排序的索引“向前”填充)。

相反,第二个选项(s1.reindex_like(s2, method='ffill'))对排序后的索引进行前向填充。
您可以通过将该结果(对索引进行排序后)与首先对s2索引进行排序的结果进行比较来验证该声明:

s_when_sort_s2_before = s1.reindex_like(s2.sort_index()).fillna(method='ffill')
s_sorted_after = s1.reindex_like(s2, method='ffill').sort_index()
pd.testing.assert_series_equal(s_when_sort_s2_before, s_sorted_after)

此断言不执行任何操作(即不引发AssertionError),因为两者确实相等。

[1]您可以通过我的dtype: object告知我与您使用的熊猫版本不同,但是我可以重现该问题,因此我认为解决方案是可行的-请在您端进行验证。