我有一段pandas代码,曾经在1.0.5版本中能够运行。以下是我问题的一个简化、自包含的示例:
import pandas as pd
df = pd.DataFrame(data=[
('bk1', 10),
('bk1', None),
('bk1', 13),
('bk1', None),
('bk2', None),
('bk2', 14),
('bk3', 12),
('bk3', None),
], columns=('book', 'price'))
grouped = df.groupby(['book'], as_index=False, sort=False)
df = grouped.fillna(method='ffill')
print(df)
在这个例子中,我们有一份图书销售清单,其中一些价格缺失。我们试图通过使用前一行来填补缺失的数据,其中该行是相同的书。
在 Pandas 1.0.5 中,这将生成一个包含两列的数据框:
book price
0 bk1 10.0
1 bk1 10.0
2 bk1 13.0
3 bk1 13.0
4 bk2 NaN
5 bk2 14.0
6 bk3 12.0
7 bk3 12.0
在Pandas 1.1.0版本中,这将删除书籍列,使输出不可用。
price
0 10.0
1 10.0
2 13.0
3 13.0
4 NaN
5 14.0
6 12.0
7 12.0
我已阅读了版本1.1.0的更新说明,但未找到任何有关此更改的说明。
问题:
- 这是Pandas中的错误还是我依赖于未定义的行为?
- 是否有更自然的方式来表达这个问题?
你可能会问的问题:
为什么不在groupby之外使用fillna?
在这个例子中,第一行bk2没有价格,但用前一行填充它是没有意义的,因为前一行是bk1的价格。
为什么使用ffill而不是删除NA值?
我的真实代码与时间序列数据一起工作,ffill是表达最新观察结果的最自然方式。