如何基于12个Pandas DataFrame生成94个新DataFrame并优化直方图
问题描述
- 现有包含12个Pandas DataFrame的列表
dfs,每个DataFrame包含94列 - 需要生成94个新DataFrame:
- 第1个新DataFrame(df1)的各列依次为
dfs[0]['column 1']、dfs[1]['column 1']…dfs[11]['column 1'] - 第2个新DataFrame(df2)的各列依次为
dfs[0]['column 2']、dfs[1]['column 2']…dfs[11]['column 2'] - 以此类推,直到第94个新DataFrame
- 第1个新DataFrame(df1)的各列依次为
- 目标是基于每个新DataFrame,将其12列的数据分别绘制为同一张图中的直方图(共94张图),但现有代码仅将数据存入列表,导致同图中不同直方图无法通过颜色区分,且未生成所需的新DataFrame
现有代码
for i in range(94): data = [] # store all i'th column data across all dfs for df in dfs: data.extend(list(df.iloc[:,i])) # i'th column plt.hist(data, bins=50, histtype = 'step', label = dfs[0].iloc[:,i].name) plt.title(dfs[0].iloc[:,i].name) # get name of column from 1st df plt.xlabel(dfs[0].iloc[:,i].name) # get name of column from 1st df plt.ylabel('Frequency Density') plt.show()
解决方案
1. 生成94个新DataFrame
用字典存储新DataFrame,键为df1到df94,方便后续调用:
import pandas as pd # 初始化存储新DataFrame的字典 new_dfs = {} # 循环处理每一列(共94列) for col_idx in range(94): columns = [] for df_idx, df in enumerate(dfs): # 重命名列,便于区分来源 col_data = df.iloc[:, col_idx].rename(f"df{df_idx+1}_{df.columns[col_idx]}") columns.append(col_data) # 合并列生成新DataFrame new_df = pd.concat(columns, axis=1) new_dfs[f"df{col_idx+1}"] = new_df
2. 绘制带颜色区分的直方图
基于新生成的DataFrame,为每个直方图分配不同颜色并添加图例:
import matplotlib.pyplot as plt # 生成12种差异化颜色 colors = plt.cm.get_cmap('tab10', 12).colors # 循环绘制每张图 for df_name, new_df in new_dfs.items(): original_col_name = new_df.columns[0].split("_", 1)[1] plt.figure(figsize=(10, 6)) # 逐个绘制新DataFrame的列 for col_idx, col in enumerate(new_df.columns): plt.hist(new_df[col], bins=50, histtype='step', label=col, color=colors[col_idx]) plt.title(f"Histogram of {original_col_name}") plt.xlabel(original_col_name) plt.ylabel('Frequency Density') plt.legend(title="Source DataFrame") plt.show()
说明
- 列名重命名为
dfX_原列名,可直接在图例中区分数据来源 - 使用
tab10色卡生成12种不同颜色,确保同图直方图颜色不重复 - 图例标注清晰,解决了原代码无法区分不同来源数据的问题
内容的提问来源于stack exchange,提问作者probablysid
相关产品推荐
相关产品推荐

