Pandas 按组填写

Pandas fillna by group

首先,这听起来像是一个非常愚蠢的问题,我认为答案应该很简单。

然而...我被这个问题困扰了几个星期,但我仍然无法解决它。

我需要的是在组中使用 fillna(method="ffill") 之类的东西。考虑下面的 DataFrame:

import pandas as pd

df = pd.read_csv("something.csv"
>>> df
    group date        price
0   1     2021-12-01  .15
1   1     2022-01-15  NaN
2   1     2021-02-03  .35
3   2     2021-12-01  NaN
4   2     2021-12-15  2.5
5   2     2022-02-03  NaN
6   3     2021-11-15  3.25
6   3     2021-12-03  NaN
6   3     2022-01-06  NaN

期望的输出是:

>>> df
    group date        price
0   1     2021-12-01  .15
1   1     2022-01-15  .15
2   1     2021-02-03  .35
3   2     2021-12-01  NaN
4   2     2021-12-15  2.5
5   2     2022-02-03  2.5
6   3     2021-11-15  3.25
6   3     2021-12-03  3.25
6   3     2022-01-06  3.25

到目前为止我已经尝试过:

df["price"] = df.groupby(["group", "date"])["price"].ffill()
df["price"] = df.groupby(["group", "date"])["price"].fillna(method="ffill")
df = df.groupby(["group", "date"]).fillna(method="ffill")
df["price"] = df.groupby(["group", "date"])["price"].apply(lambda x :x.ffill())

我找到了几个类似的答案,但其中 none 给出了预期的结果。

我想你错过了简单的:

df['price'] = df.groupby('group')['price'].ffill()

确实,您不应该按日期分组,因为您只有大小为 1 的组。

输出(为清楚起见,使用不同的列):

   group        date  price  price_ffill
0      1  2021-12-01   0.15         0.15
1      1  2022-01-15    NaN         0.15
2      1  2021-02-03   0.35         0.35
3      2  2021-12-01    NaN          NaN
4      2  2021-12-15   2.50         2.50
5      2  2022-02-03    NaN         2.50
6      3  2021-11-15   3.25         3.25
6      3  2021-12-03    NaN         3.25
6      3  2022-01-06    NaN         3.25