(pandas) 为什么 .bfill().ffill() 与 ffill().bfill() 在组上的行为不同?

(pandas) Why does .bfill().ffill() act differently than ffill().bfill() on groups?

我想我在概念上遗漏了一些基本的东西,但我无法在文档中找到答案。

>>> df=pd.DataFrame({'a':[1,1,2,2,3,3], 'b':[5,np.nan, 6, np.nan, np.nan, np.nan]})
>>> df
   a    b
0  1  5.0
1  1  NaN
2  2  6.0
3  2  NaN
4  3  NaN
5  3  NaN

先使用 ffill(),然后使用 bfill():

>>> df.groupby('a')['b'].ffill().bfill()
0    5.0
1    5.0
2    6.0
3    6.0
4    NaN
5    NaN

先使用 bfill(),然后使用 ffill():

>>> df.groupby('a')['b'].bfill().ffill()
0    5.0
1    5.0
2    6.0
3    6.0
4    6.0
5    6.0

第二种方式不是打散了分组吗?第一种方法是否始终确保只用该组中的其他值填充值?

我认为你需要:

print (df.groupby('a')['b'].apply(lambda x: x.ffill().bfill()))
0    5.0
1    5.0
2    6.0
3    6.0
4    NaN
5    NaN
Name: b, dtype: float64

print (df.groupby('a')['b'].apply(lambda x: x.bfill().ffill()))
0    5.0
1    5.0
2    6.0
3    6.0
4    NaN
5    NaN
Name: b, dtype: float64

因为在您的样本中只有第一个 ffillbfillDataFrameGroupBy.ffill or DataFrameGroupBy.bfill,第二个是输出 Series。所以它打破了组,因为 Series 没有组。

print (df.groupby('a')['b'].ffill())
0    5.0
1    5.0
2    6.0
3    6.0
4    NaN
5    NaN
Name: b, dtype: float64

print (df.groupby('a')['b'].bfill())
0    5.0
1    NaN
2    6.0
3    NaN
4    NaN
5    NaN
Name: b, dtype: float64