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

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'

我有一段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
我已经读过了,我找不到任何关于这一变化的评论

问题:

  • 这是熊猫身上的虫子,还是我依赖未定义的行为
  • 有没有更自然的方式来表达这一点
  • 您可能会问的问题:

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

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

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

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

  • 变通办法 groupby可以表示为:

    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”)
    a
    transform
    可以在这里同样工作,并分配任务。我敢说,在这种情况下,它将比应用程序更快。不过,很好地了解了原因<代码>df[“价格”]=分组。转换(“ffill”)