Pandas groupby在1.1.0中的fillna之后删除组列

2024-06-12 13:04:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段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中,这将删除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

我读了patch notes for version 1.1.0,找不到任何关于这一变化的评论

问题:

  1. 这是熊猫身上的虫子,还是我依赖未定义的行为
  2. 有没有更自然的方式来表达这一点

您可能会问的问题:

  1. 为什么不在没有groupby的情况下使用fillna

    在本例中,包含bk2的第一行没有价格,但是用上一行(即bk1的价格)填充它没有任何意义

  2. 为什么使用ffill而不是删除NA值

    我真正的代码是处理timeseries数据的,而ffill是表达上一次已知观察结果的最自然的方式


Tags: 数据代码nonepandasdfas价格price
2条回答

通过使用update函数,您可以采取不同的方法来解决这个问题(与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

这也适用于两个版本

变通办法

groupby可以表示为:

df = grouped.apply(lambda df: df.fillna(method='ffill'))

这两个版本都适用

原因

此问题可能与此更改有关,尽管它发生在不同的版本中:

The methods ffill, bfill, pad and backfill of DataFrameGroupBy previously included the group labels in the return value, which was inconsistent with other groupby transforms. Now only the filled values are returned. (GH21521)

Source。)

相关问题 更多 >