如何匹配pandas DataFrame与ndarray的日期并提取对应code到新列表
问题原因分析
- 第一段代码错误点:
- 嵌套遍历两个序列的逻辑冗余,时间复杂度极高,不适用于近30万条数据的处理场景
- 匹配成功后append的是全量的
raw_data.codesSeries,不是当前匹配行对应的code值,导致最终列表里全是相同的全量code序列
- 第二段代码错误点:
- 循环变量混淆:
for j in reb_dates取到的j是reb_dates里的日期字符串,不是索引,reb_dates[j]属于用值当索引取值,逻辑完全错误 - 同理
for q in raw_data.Dates取到的q是日期值,raw_data['Dates'][q]是用日期值当行索引取数,你的DataFrame行索引不是日期的话必然抛出KeyError
- 循环变量混淆:
最优解决方案
pandas内置的向量化操作远快于自行编写的嵌套循环,以下实现仅需几行代码即可完成需求,执行效率比嵌套循环高数十倍。
前置处理:统一日期格式(避免字符串格式不匹配)
先把两个数据源的日期统一处理成无多余空格的字符串格式,避免隐形不匹配:
# 处理DataFrame的日期列,转字符串并去除前后空格 raw_data['Dates'] = raw_data['Dates'].astype(str).str.strip() # 处理ndarray的日期列表,去除前后空格 reb_dates = np.array([date_str.strip() for date_str in reb_dates])
方案1:提取所有匹配日期的code到一个一维列表
filtered_codes = raw_data[raw_data['Dates'].isin(reb_dates)]['code'].tolist()
方案2:按日期分组,存储每个匹配日期对应的code列表
如果需要按日期区分对应的code,用groupby聚合即可:
code_by_date = raw_data[raw_data['Dates'].isin(reb_dates)]\ .groupby('Dates')['code'].apply(list).to_dict() # 如果需要转为列表格式,直接取list(code_by_date.values())即可
内容的提问来源于stack exchange,提问作者user12447159
相关产品推荐
相关产品推荐

