创建一个新的pandas Dataframe ,编译来自许多现有pandas Dataframe 的信息

cedebl8k  于 2023-02-02  发布在  其他
关注(0)|答案(2)|浏览(108)

我有一个包含12个Pandas Dataframe 的列表。每个 Dataframe 有94列。如何创建一个循环来创建94个新 Dataframe ?第一个新 Dataframe (为了简单起见,我们称之为DF1)应该在其第一列中具有dfs[1]['column 1'],然后在其第二列中具有dfs[2]['column 1']第二新 Dataframe (df2)应该在其第一列中具有dfs[1]['column 2'],然后在其第二列中具有dfs[2]['column 2'],等等。
这意味着我可以将df1的每一列绘制到一个直方图上,然后将df2的每一列绘制到一个新的直方图上,等等,这样我就可以在最后绘制94个直方图(我自己可以简单地将每个新的 Dataframe 附加到一个列表中,然后通过 Dataframe 和列标题执行嵌套的for循环)
现在,我的代码生成了正确数量的直方图(94),但不是生成新的Pandas 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()

dfs是包含所有原始12个 Dataframe 的列表。

3z6pesqy

3z6pesqy1#

我想到了一个比之前更好的答案,你可以用一个多索引来连接所有的 Dataframe ,并使用多索引来获得所有同名列的视图。

df_index = range(len(dfs))
df_combined = pd.concat(dfs, axis=1, keys= df_index, copy=False)
columns = df_combined.columns.levels[1].tolist()

idx = pd.IndexSlice
for col in columns:
    df = df_combined.loc[:, idx[:, col]]  # select all columns matching col
    df.columns = df.columns.droplevel(1)
    for name in df:
        plt.hist(df[name], bins=50, histtype='step', label=name)
    plt.title(col)  # name of column
    plt.xlabel(col)
    plt.ylabel('Frequency Density')
    plt.legend()
    plt.show()
xqk2d5yq

xqk2d5yq2#

您可能认为为了节省内存,避免同时构建所有94个新 Dataframe 是个好主意。但是,Pandas不需要复制底层数据(除非您希望这样做),因此新 Dataframe 可以简单地包含原始12个 Dataframe 的视图。

new_dfs = {}
columns = range(len(dfs))  # specify column names
for col in dfs[0].columns:
    new_df = pd.concat([df[col] for df in dfs], axis=1, 
                       keys=columns, copy=False)
    new_dfs[col] = new_df
    • 更新**

我在pd.concat中添加了关键字参数copy=False,因为默认情况下,它会复制数据。
下面是绘制新数据的代码

for name, df in new_dfs.items():
    for col in df:
        plt.hist(df[col], bins=50, histtype='step', label=col)
    plt.title(name)  # name of column
    plt.xlabel(name)
    plt.ylabel('Frequency Density')
    plt.legend()
    plt.show()

相关问题