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
(或两者),也许还可以使用线性插值,您的结果会相应地发生变化。然而,这就是您入门所需要的。
我对 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)
:
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
(或两者),也许还可以使用线性插值,您的结果会相应地发生变化。然而,这就是您入门所需要的。