python - Pandas fillna() 按特定顺序排列

标签 python pandas dataframe nan fillna

我的 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/

相关文章:

python - 删除文本而不在 Python 中切片

python - 如何对某些列进行 df.groupby(cols).apply(my_func),同时保留一些列未处理?

python - 使用 Python Pandas 计算第二天为特定值的概率

python - pandas 保留满足或失败条件的两行

python - 将一列拆分为多列,计数频率: 'int' object is not iterable

python - 为特定包覆盖我公司的专有 pypi 存储库 (kaggle)

python - 将生菜与 TeamCity 集成

python - 在 pandas 中将一列连接到另一列的末尾后获取列的平均值

python - Selenium WebDriver Python : Unable to switch to pop up

python - 如何将行转换为数据框 pandas 内的列表