Pandas fillna() 以特定顺序排列的行

Pandas fillna() rows in a specific order

我对 fillna() 方法有疑问。这是我的示例 df,它表示商店中的商品数量。我想填写所有 NaNs。如果有 NaN,我想用前一天的值填充它,或者如果它是 NaN,那么从第二天开始(相同的产品,相同的商店)。如果特定产品和商店的所有日期都是 NaNs,那么我想用 0 填充它。我正在寻找最好的 pandas 方法,我有一些循环的想法,但看起来不太好。

我的 df:

    day    shop  product  quantity
0     1  shop_A   apples       3.0
1     2  shop_A   apples       NaN
2     3  shop_A   apples       1.0
3     1  shop_A  bananas       NaN
4     2  shop_A  bananas       NaN
5     3  shop_A  bananas       NaN
6     1  shop_B   apples       NaN
7     2  shop_B   apples       NaN
8     3  shop_B   apples       2.0
9     1  shop_B  bananas       NaN
10    2  shop_B  bananas       4.0
11    3  shop_B  bananas       2.0

预期 df:

    day    shop  product  quantity
0     1  shop_A   apples       3.0
1     2  shop_A   apples       3.0
2     3  shop_A   apples       1.0
3     1  shop_A  bananas       0.0
4     2  shop_A  bananas       0.0
5     3  shop_A  bananas       0.0
6     1  shop_B   apples       2.0
7     2  shop_B   apples       2.0
8     3  shop_B   apples       2.0
9     1  shop_B  bananas       4.0
10    2  shop_B  bananas       4.0
11    3  shop_B  bananas       2.0

我也试过 fillna(limit=3),但这不是我要找的。

您可以使用 sort_values 按天排序,然后执行分组 bfill 然后剩下的将通过链接 fillna(0):

得到 0
df['quantity'] = df.sort_values(by='day')\
                 .groupby(['shop','product'])['quantity'].bfill(limit=3).fillna(0)

回印:

    day    shop  product  quantity
0     1  shop_A   apples       3.0
1     2  shop_A   apples       1.0
2     3  shop_A   apples       1.0
3     1  shop_A  bananas       0.0
4     2  shop_A  bananas       0.0
5     3  shop_A  bananas       0.0
6     1  shop_B   apples       2.0
7     2  shop_B   apples       2.0
8     3  shop_B   apples       2.0
9     1  shop_B  bananas       4.0
10    2  shop_B  bananas       4.0
11    3  shop_B  bananas       2.0

这将为每家商店和产品提供第二天的价值与前一天的 NaN 价值。您可以类似地使用 ffill(或两者),也许还可以使用线性插值,您的结果会相应地发生变化。然而,这就是您入门所需要的。