You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决Pandas中为DataFrame添加MSFT每日最高收盘价列时的NaN问题

问题描述

原始数据

Date, Symbol, Close
2021-01-01, AAPL, 10
2021-01-02, AAPL, 12
2021-01-03, AAPL, 3
2021-01-01, MSFT, 12
2021-01-02, MSFT, 20
2021-01-03, MSFT, 12
2021-01-01, MSFT, 1
2021-01-02, MSFT, 2
2021-01-03, MSFT, 3

需求

  • 提取'MSFT'每日的最高Close值
  • 将该值作为新列MSFT_MAX_CLOSE添加到原DataFrame中,所有行(包括AAPL的行)都要匹配对应日期的MSFT最大值

尝试的代码(出现NaN值)

df['MSFT_MAX_CLOSE'] = df.loc[df['Symbol']=='MSFT'].groupby(['Date'])['Close'].transform(max)

预期输出

Date, Symbol, Close, MSFT_MAX_CLOSE
2021-01-01, AAPL, 10, 12
2021-01-02, AAPL, 12, 20
2021-01-03, AAPL, 3, 12
2021-01-01, MSFT, 12, 12
2021-01-02, MSFT, 20, 20
2021-01-03, MSFT, 12, 12
2021-01-01, MSFT, 1, 12
2021-01-02, MSFT, 2, 20
2021-01-03, MSFT, 3, 12
解决方法

你之前的代码只对MSFT的行计算了最大值,但赋值回原DataFrame时,非MSFT的行没有匹配的索引,所以出现NaN。下面两种方法可以解决这个问题:

方法一:分组计算后合并

# 先单独计算MSFT每日的最高Close值,生成带日期的结果表
msft_daily_max = df[df['Symbol'] == 'MSFT'].groupby('Date')['Close'].max().reset_index(name='MSFT_MAX_CLOSE')

# 将结果表与原DataFrame按日期合并,确保所有行都能匹配到对应值
df = df.merge(msft_daily_max, on='Date', how='left')

方法二:通过字典映射赋值

# 生成日期到MSFT当日最大值的字典
msft_max_dict = df[df['Symbol'] == 'MSFT'].groupby('Date')['Close'].max().to_dict()

# 用map方法将每个日期对应的值映射到新列
df['MSFT_MAX_CLOSE'] = df['Date'].map(msft_max_dict)

这两种方法都能让所有行(包括AAPL的行)正确获取对应日期的MSFT最高Close值,完全符合预期输出。

内容的提问来源于stack exchange,提问作者greenguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:31:02