合并DataFrame重复列:基于Series构建DataFrame的问题求助
解决Pandas追加Series导致重复列的问题
嗨,我来帮你搞定这个重复列的问题!你现在遇到的情况是因为用append()逐个添加单个元素的Series时,Pandas会把每个Series的Name当作新列名,导致相同股票名称的列重复出现,而且值只在对应行填充,其他行都是NaN。
最简洁的解决方案:收集Series后合并再转置
我们可以换个思路,先把所有的temp_num收集到列表里,然后用Pandas的内置函数合并并整理成你想要的格式:
# 初始化列表收集所有Series series_collection = [] all_keys = list(dict_months.keys()) for i in all_keys: for j in range(len(dict_months[i])): temp_num = df_mth_return.loc['1992-'+str(i), dict_months[i][j]] series_collection.append(temp_num) # 合并所有Series成一个大Series combined_series = pd.concat(series_collection) # 将股票名称(原Series的Name)转成列,日期作为索引 final_df = combined_series.unstack(level=-1)
为什么这个方法有效?
pd.concat(series_collection)会把所有Series堆叠成一个大Series,索引是日期(Date),每个元素的关联信息是原Series的Name(股票名称)。unstack(level=-1)会把股票名称从元素属性转成DataFrame的列,自动将相同日期的股票值对齐,重复的列会被合并,每个日期对应的股票值会正确填充到对应的单元格。
备选方案:用字典整理数据后构建DataFrame
如果你更喜欢分步处理,也可以用字典先整理每个股票的日期和数值:
# 初始化字典,键是股票名称,值是{日期: 收益率}的字典 stock_data = {} all_keys = list(dict_months.keys()) for i in all_keys: for j in range(len(dict_months[i])): temp_num = df_mth_return.loc['1992-'+str(i), dict_months[i][j]] stock_name = temp_num.name date = temp_num.index[0] value = temp_num.iloc[0] if stock_name not in stock_data: stock_data[stock_name] = {} stock_data[stock_name][date] = value # 构建最终DataFrame final_df = pd.DataFrame(stock_data)
这个方法会直接按股票名称创建列,日期作为索引,自动填充对应的值,没有重复列。
验证结果
用你给出的示例数据,两种方法都会得到符合预期的格式:相同列只显示一次,日期与对应股票值正确对齐。
内容的提问来源于stack exchange,提问作者J Westwood
相关产品推荐
相关产品推荐

