解决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
相关产品推荐
相关产品推荐

