如何遍历pandas DataFrame字段、对比值并匹配另一DataFrame的日期?
报错原因
本次报错的核心诱因:
- 代码中
if df['Boolean'] == 'False':是直接对整个布尔列(Series对象)做条件判断,pandas无法确定需要判断「所有值为假」还是「任意值为假」,因此抛出真值歧义错误 - 额外存在两个逻辑错误:
- 生成的
df['Boolean']是原生布尔类型,取值为True/False,不是字符串,不需要加引号和'False'做比较 - 直接用
newsdf[h] == df['Date']是两个Series的逐行比较,同样会触发同类歧义问题
- 生成的
实现方案
方案1:向量化匹配(推荐,性能更高)
不需要手动逐行遍历列,用pandas内置方法即可高效完成判断和匹配:
import pandas as pd # 1. 生成涨跌标记列:False对应下跌(看空信号),True对应上涨(看多信号) df['is_rise'] = df['Open'] < df['Close'] # 2. 统一日期格式避免匹配失败,根据实际数据格式调整 df['Date'] = pd.to_datetime(df['Date']).dt.date newsdf.iloc[:, 0] = pd.to_datetime(newsdf.iloc[:, 0]).dt.date # 3. 转成集合加快匹配速度,假设newsdf只有日期一列 news_date_set = set(newsdf.iloc[:, 0]) # 4. 遍历判断输出结果 for idx, row in df.iterrows(): if not row['is_rise']: if row['Date'] in news_date_set: # 取新闻对应的索引 news_idx = newsdf[newsdf.iloc[:, 0] == row['Date']].index[0] print('Bearish signal ') print(news_idx) else: print('Signal bullish')
方案2:单独遍历Boolean列(符合原思路需求)
如果只需要单独遍历Boolean列逐行判断,可以用如下写法:
df['Boolean'] = df['Open'] < df['Close'] # 提前做格式转换和集合预处理同上 news_date_set = set(newsdf.iloc[:, 0]) for i, bool_val in df['Boolean'].items(): current_date = df.loc[i, 'Date'] if not bool_val: if current_date in news_date_set: news_idx = newsdf[newsdf.iloc[:, 0] == current_date].index[0] print('Bearish signal ') print(news_idx) else: print('Signal bullish')
注意事项
如果newsdf中存在重复日期,上述代码默认返回第一个匹配的索引,需要返回所有匹配索引可将index[0]替换为to_list()输出列表。
内容的提问来源于stack exchange,提问作者MATH ASKER
相关产品推荐
相关产品推荐

