【问题标题】:Pandas fillna() rows in a specific orderPandas fillna() 以特定顺序排列的行
【发布时间】:2021-12-31 11:15:04
【问题描述】:

fillna() 方法有问题。这是我的示例 df,它表示商店中的商品数量。我想填写所有 NaN。如果有 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),但这不是我要找的。​​p>

【问题讨论】:

    标签: python pandas dataframe nan fillna


    【解决方案1】:

    您可以使用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(或两者),也可以使用线性插值,您的结果会相应改变。然而,这是您开始的必要条件。

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2020-06-18
      • 2019-01-08
      • 2023-03-10
      相关资源
      最近更新 更多