按一列分组,如果日期列相同,则在数值列中填写缺失值

Groupby one column, if the date column are the same, fill in the missing values in the numerical column

提问人:ah bon 提问时间:11/15/2023 更新时间:11/15/2023 访问量:33

问:

假设数据帧如下: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

对于每组(在此示例中,有 和 ),如果 的值相同,我需要用该日期存在的值填充 NaN。举个例子,我们看到 in 行 、 和 和 是缺失值,但它们出现在行 (或 ) 和 中,因此我们需要使用行 (或 ) 中现有的实际值来填充行 和 。注意:对于本示例中的每组数据,同一日期的实际值是相同的(例如,行和、行和中的实际值相同)。如何实现这一点?谢谢。codeLX0301LX0101dateactual_valueactual_valueLX0301actual_value0142023/8/312023/9/30637637014361215

所需结果如下:

          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
python-3.x pandas 数据帧

评论


答:

1赞 ah bon 11/15/2023 #1

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

# 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

评论

1赞 Scott Boston 11/15/2023
感谢您的编辑。我是你解决方案的原始+1。感谢您的贡献和快乐的编码!
3赞 Scott Boston 11/15/2023 #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