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

yob*_*oya 3 group-by pandas pandas-groupby

我认为我在概念上缺少一些基本的东西,但我无法在文档中找到答案.

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

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

使用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
Run Code Online (Sandbox Code Playgroud)

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

jez*_*ael 8

我想你需要:

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
Run Code Online (Sandbox Code Playgroud)

因为在你的样本中只有第一个ffill或是bfill,DataFrameGroupBy.ffill或者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
Run Code Online (Sandbox Code Playgroud)