Pandas匹配另一DataFrame条件填充空值及ValueError报错求解
报错原因
你遇到的ValueError: Can only compare identically-labeled Series objects报错核心原因是:
- 代码中
df_buy['buy_price'] > df_day['20MA']是对两个长度、索引完全不匹配的Series做逐行比较,df_buy是8行买入记录,df_day是全量日线数据,pandas无法对应两行之间的匹配关系,因此抛出错误。
同时你原有代码还存在其他逻辑偏差:
- 筛选晚于买入日+2天的记录时,错误用了全量
df_day的时间列,而非已经过滤完同标的的df_filt1的时间列,会导致筛选结果错误 - FCU规则是「收盘价低于10MA」,但你的逻辑写为「买入价高于20MA」,完全不符合需求定义
- 直接用
.iloc[0]取值未做非空判断,如果没有符合条件的记录会直接报错 - 链式赋值
df_buy['xxx'].loc[i]会触发SettingWithCopyWarning,可能导致赋值不生效
修正后代码
首先提前做时间格式统一预处理,避免循环内重复操作:
import pandas as pd # 提前统一转换时间格式,提升执行效率 df_buy['Time'] = pd.to_datetime(df_buy['Time']) df_day['Time'] = pd.to_datetime(df_day['Time'])
然后修改循环逻辑,完全匹配需求:
for idx, buy_row in df_buy.iterrows(): # 筛选同标的的日线数据 same_symbol_day = df_day[df_day['Symbol'] == buy_row['Symbol']].copy() # 筛选晚于买入日+2天的记录 trade_start_time = buy_row['Time'] + pd.Timedelta(2, unit='d') valid_day = same_symbol_day[same_symbol_day['Time'] >= trade_start_time] # 按时间升序排序,保证取到的第一条是最早的符合条件记录 valid_day.sort_values(by='Time', inplace=True) # 筛选收盘价低于10MA的FCU记录 fcu_record = valid_day[valid_day['Close'] < valid_day['10MA']] # 非空判断,避免无符合记录时报错 if not fcu_record.empty: first_fcu = fcu_record.iloc[0] # 用loc直接赋值避免链式赋值警告 df_buy.loc[idx, 'date_FCU_10dMA'] = first_fcu['Time'] df_buy.loc[idx, 'price_FCU_10dMA'] = first_fcu['Close']
内容的提问来源于stack exchange,提问作者Trippy Dippy
相关产品推荐
相关产品推荐

