代码之家  ›  专栏  ›  技术社区  ›  ah bon

按一列分组,如果日期列相同,则填写数字列中缺少的值

  •  1
  • ah bon  · 技术社区  · 2 年前

    假设数据帧 df 如下所示:

              date  actual_value  fitted_value  predicted_value    code
    0    2023/8/31           NaN           NaN       520.994413  LX0301
    1    2023/9/30           NaN           NaN       580.967973  LX0301
    2   2023/10/31           NaN           NaN       650.392867  LX0301
    3    2023/8/31    471.459992    520.027310              NaN  LX0301
    4    2023/9/30           NaN           NaN       531.199547  LX0301
    5   2023/10/31           NaN           NaN       600.053484  LX0301
    6    2023/8/31    471.459992    511.902229              NaN  LX0301
    7    2023/9/30    480.400211    518.202630              NaN  LX0301
    8   2023/10/31           NaN           NaN       537.890792  LX0301
    9    2023/8/31           NaN           NaN        99.216818  LX0101
    10   2023/9/30           NaN           NaN        98.624779  LX0101
    11  2023/10/31           NaN           NaN        98.690596  LX0101
    12   2023/8/31     99.400000     99.221767              NaN  LX0101
    13   2023/9/30           NaN           NaN        98.822977  LX0101
    14  2023/10/31           NaN           NaN        98.875062  LX0101
    15   2023/8/31     99.400000     99.220693              NaN  LX0101
    16   2023/9/30     98.700000     98.802146              NaN  LX0101
    17  2023/10/31           NaN           NaN        98.738091  LX0101
    

    对于每组 code (在本例中,有 LX0301 LX0101 ),如果 date 的值相同,我需要填写NaN actual_value 实际值 在那个日期存在的。拿 LX0301 例如,我们看到 实际值 成行 0 , 1 4 , 2023/8/31 2023/9/30 缺少值,但它们显示在行中 6 (或 3 )以及 7 ,因此我们需要使用行中现有的实际值 6. (或 3. )以及 7. 填写行 0 , 1. 4. 。注意:对于本例中的每组数据,同一日期的实际值是相同的(例如,行中的实际值 3. 6. ,行 12 15 是相同的)。如何做到这一点?谢谢

    所需结果如下:

              date  actual_value  fitted_value  predicted_value    code
    0    2023/8/31    471.459992           NaN       520.994413  LX0301
    1    2023/9/30    480.400211           NaN       580.967973  LX0301
    2   2023/10/31           NaN           NaN       650.392867  LX0301
    3    2023/8/31    471.459992    520.027310              NaN  LX0301
    4    2023/9/30    480.400211           NaN       531.199547  LX0301
    5   2023/10/31           NaN           NaN       600.053484  LX0301
    6    2023/8/31    471.459992    511.902229              NaN  LX0301
    7    2023/9/30    480.400211    518.202630              NaN  LX0301
    8   2023/10/31           NaN           NaN       537.890792  LX0301
    9    2023/8/31     99.400000           NaN        99.216818  LX0101
    10   2023/9/30     98.700000           NaN        98.624779  LX0101
    11  2023/10/31           NaN           NaN        98.690596  LX0101
    12   2023/8/31     99.400000     99.221767              NaN  LX0101
    13   2023/9/30     98.700000           NaN        98.822977  LX0101
    14  2023/10/31           NaN           NaN        98.875062  LX0101
    15   2023/8/31     99.400000     99.220693              NaN  LX0101
    16   2023/9/30     98.700000     98.802146              NaN  LX0101
    17  2023/10/31           NaN           NaN        98.738091  LX0101
    
    2 回复  |  直到 2 年前
        1
  •  3
  •   ah bon    2 年前

    尝试:

    df['actual_value_new'] = df.groupby(['code','date'])['actual_value'].transform('first')
    

    输出(已使用 actual_value_new 仅用于显示旧列和新列):

              date  actual_value  fitted_value  predicted_value    code  actual_value_new
    0    2023/8/31           NaN           NaN       520.994413  LX0301        471.459992
    1    2023/9/30           NaN           NaN       580.967973  LX0301        480.400211
    2   2023/10/31           NaN           NaN       650.392867  LX0301               NaN
    3    2023/8/31    471.459992    520.027310              NaN  LX0301        471.459992
    4    2023/9/30           NaN           NaN       531.199547  LX0301        480.400211
    5   2023/10/31           NaN           NaN       600.053484  LX0301               NaN
    6    2023/8/31    471.459992    511.902229              NaN  LX0301        471.459992
    7    2023/9/30    480.400211    518.202630              NaN  LX0301        480.400211
    8   2023/10/31           NaN           NaN       537.890792  LX0301               NaN
    9    2023/8/31           NaN           NaN        99.216818  LX0101         99.400000
    10   2023/9/30           NaN           NaN        98.624779  LX0101         98.700000
    11  2023/10/31           NaN           NaN        98.690596  LX0101               NaN
    12   2023/8/31     99.400000     99.221767              NaN  LX0101         99.400000
    13   2023/9/30           NaN           NaN        98.822977  LX0101         98.700000
    14  2023/10/31           NaN           NaN        98.875062  LX0101               NaN
    15   2023/8/31     99.400000     99.220693              NaN  LX0101         99.400000
    16   2023/9/30     98.700000     98.802146              NaN  LX0101         98.700000
    17  2023/10/31           NaN           NaN        98.738091  LX0101               NaN
    
        2
  •  1
  •   ah bon    2 年前

    下面的代码似乎可以工作。欢迎您指出问题或分享其他解决方案:

    # Convert the 'date' column to datetime type
    df['date'] = pd.to_datetime(df['date'])
    # Group by 'code' and 'date', and fill missing values in 'actual_value' column
    df['actual_value'] = df.groupby(['code', 'date'])['actual_value'].transform(lambda x: x.fillna(x.dropna().max()))
    print(df)
    

    输出:

             date  actual_value  fitted_value  predicted_value    code
    0  2023-08-31    471.459992           NaN       520.994413  LX0301
    1  2023-09-30    480.400211           NaN       580.967973  LX0301
    2  2023-10-31           NaN           NaN       650.392867  LX0301
    3  2023-08-31    471.459992    520.027310              NaN  LX0301
    4  2023-09-30    480.400211           NaN       531.199547  LX0301
    5  2023-10-31           NaN           NaN       600.053484  LX0301
    6  2023-08-31    471.459992    511.902229              NaN  LX0301
    7  2023-09-30    480.400211    518.202630              NaN  LX0301
    8  2023-10-31           NaN           NaN       537.890792  LX0301
    9  2023-08-31     99.400000           NaN        99.216818  LX0101
    10 2023-09-30     98.700000           NaN        98.624779  LX0101
    11 2023-10-31           NaN           NaN        98.690596  LX0101
    12 2023-08-31     99.400000     99.221767              NaN  LX0101
    13 2023-09-30     98.700000           NaN        98.822977  LX0101
    14 2023-10-31           NaN           NaN        98.875062  LX0101
    15 2023-08-31     99.400000     99.220693              NaN  LX0101
    16 2023-09-30     98.700000     98.802146              NaN  LX0101
    17 2023-10-31           NaN           NaN        98.738091  LX0101