使用for循环拼接Pandas Series时返回空值,寻求解决方案
解决for循环合并Pandas列时的空值问题
你的空值问题大概率是因为每次调用doAnalitica返回的DataFrame(a.df)索引不一致导致的——不同股票的交易日期可能不完全重叠,用outer join合并时,没有对应日期的位置就会自动填充NaN。下面给你几个针对性的解决方案:
1. 先收集所有列再一次性合并(推荐,效率更高)
与其在循环里一次次concat,不如先把所有需要的列收集到列表里,最后一次性合并,还能灵活控制索引的对齐方式:
import pandas as pd columns_list = [] # 遍历每个symbol for i in fiancial['symbol'][::100]: a = day.doAnalitica(i, '119', '3M') # 重命名Close列为"Close + 股票代码",并添加到列表 renamed_col = a.df['Close'].rename(f'Close {i}') columns_list.append(renamed_col) # 一次性合并:用join='inner'只保留所有股票都有数据的日期(避免空值) # 如果需要保留所有日期,就用join='outer',之后可以按需填充空值 df1 = pd.concat(columns_list, axis=1, join='inner')
如果用join='outer'保留所有日期,你可以后续用df1.fillna(method='ffill')(向前填充)或者df1.fillna(0)等方式处理空值,根据你的业务需求选择。
2. 对齐到基准索引
如果希望所有列都对齐到某一个基准的日期索引(比如第一只股票的日期范围),可以这样做:
import pandas as pd # 先处理第一个symbol,初始化df1并获取基准索引 symbols = fiancial['symbol'][::100] first_i = symbols.iloc[0] a_first = day.doAnalitica(first_i, '119', '3M') df1 = a_first.df['Close'].rename(f'Close {first_i}').to_frame() # 遍历剩下的symbol for i in symbols[1:]: a = day.doAnalitica(i, '119', '3M') renamed_col = a.df['Close'].rename(f'Close {i}') # 将当前列对齐到df1的索引,缺失的位置自动补NaN(也可以用dropna丢弃不匹配的) aligned_col = renamed_col.reindex(df1.index) df1 = pd.concat([df1, aligned_col], axis=1)
这种方式能保证所有列的索引和第一只股票完全一致,避免新增额外的日期索引。
3. 处理单只股票自身的空值
如果空值是某只股票自身数据里存在的缺失(不是日期不匹配导致的),可以在收集列的时候先清洗:
# 示例:丢弃空值行 renamed_col = a.df['Close'].rename(f'Close {i}').dropna() # 或者用均值填充 renamed_col = a.df['Close'].rename(f'Close {i}').fillna(a.df['Close'].mean())
内容的提问来源于stack exchange,提问作者Claudio Mazzoni
相关产品推荐
相关产品推荐

