Python Pandas groupby在1.1.0中的fillna之后删除组列
我有一段pandas代码,用于1.0.5版。以下是我的问题的一个简化、独立的示例:Python Pandas groupby在1.1.0中的fillna之后删除组列,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一段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'
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中,这将删除book列,从而使输出不可用
price
0 10.0
1 10.0
2 13.0
3 13.0
4 NaN
5 14.0
6 12.0
7 12.0
我已经读过了,我找不到任何关于这一变化的评论
问题:
df = grouped.apply(lambda df: df.fillna(method='ffill'))
这两个版本都适用
原因
此问题可能与此更改有关,尽管它发生在不同的版本中:
DataFrameGroupBy
的ffill
、bfill
、pad
和backfill
方法以前在返回值中包含了组标签,这与其他groupby
转换不一致。现在只返回已填充的值。(GH21521)
()解决方法
groupby可以表示为:
df = grouped.apply(lambda df: df.fillna(method='ffill'))
这两个版本都适用
原因
此问题可能与此更改有关,尽管它发生在不同的版本中:
DataFrameGroupBy
的ffill
、bfill
、pad
和backfill
方法以前在返回值中包含了组标签,这与其他groupby
转换不一致。现在只返回已填充的值。(GH21521)
()通过使用以下函数,您可以采取不同的方法来解决此问题(不同于Nick ODell提出的解决方案):
df.update(df.groupby(['book']).ffill())
print(df)
Out[1]:
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
这也适用于两个版本。您可以采用不同的方法来解决此问题(与Nick ODell提出的解决方案不同),方法是使用以下函数:
df.update(df.groupby(['book']).ffill())
print(df)
Out[1]:
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
这在两个版本中都有效。这不是错误……ffill是通过1位置上先前的not NaN、bk2、NaN显示来填充NaN的,因此它不会被填充这是故意的。我不想让菲尔在两组之间填补空缺。请参阅“您可能会问的问题#1”。问题是缺少的列。这不是错误…ffill是通过1位置上先前的not NaN、bk2、NaN显示填充NaN,因此它不会被填充这是故意的。我不想让菲尔在两组之间填补空缺。请参阅“您可能会问的问题1”。问题是缺少一列。
transform
在这里同样可以工作,只要有一个作业。我敢说,在这种情况下,它将比应用程序更快。不过,很好地了解了原因df[“price”]=grouped.transform(“ffill”)
atransform
可以在这里同样工作,并分配任务。我敢说,在这种情况下,它将比应用程序更快。不过,很好地了解了原因<代码>df[“价格”]=分组。转换(“ffill”)