我的 fillna()
方法有问题。这是我的示例 df,它表示商店中商品的数量。我想填充所有NaN。如果有 NaN,我想用前一天的值填充它,或者如果它是 NaN,则从第二天开始(相同的产品,相同的商店) )。如果特定产品和商店的所有日期都是 NaN,那么我想用 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
(或两者),也许还可以使用线性插值,您的结果将相应改变。然而,这正是您开始使用所需要的。
关于python - Pandas fillna() 按特定顺序排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70541735/