首页 > 解决方案 > 如何在多个 CSV 文件上使用 describe() 并使用 CSV 文件名保存到一个文件中

问题描述

我有 4 个 CSV 文件。我正在使用describe()方法来获取所有文件的描述。代码工作没有任何错误

def describe():
        descr = []
        for csv in CSVS:
            dataset_name = csv.stem[: csv.stem.find("_")]
            df = pd.read_csv(csv)
            des = df.groupby("Method").describe().round(2).Col11
            des.name = dataset_name
            descr.append(des.T)
        descr_df = pd.concat(descr)
        return descr_df

我得到的输出

    Method_1    Method_2    Method_3
Count
mean
Std
min
...

我的预期输出如下

                  Dataset_1    Dataset_2    Dataset_3
Method_1    Count
            mean
            Std
            min
...
Method_2    Count
            mean
            Std
            min

任何形式的建议表示赞赏。

标签: pythonpython-3.xpandas

解决方案


stack每个摘要和unstack级别 0 并stack再次调用.to_frame并传递数据框的名称(摘要所属)即您想要的列名,最后重置列,对所有数据框摘要执行此操作,最后outer合并它们,重命名根据要求列,并设置索引

pd.merge(df1.describe().stack().unstack(0).stack().to_frame('df1').reset_index(),
        df2.describe().stack().unstack(0).stack().to_frame('df2').reset_index(), how='outer')\
.rename(columns={'level_0':'Methods', 'level_1':'Statistics'})\
.set_index(['Methods',  'Statistics'])

输出:

                         df1       df2
Methods Statistics                    
A       count       5.000000  5.000000
        mean        0.521492  0.620648
        std         0.262874  0.373520
        min         0.129904  0.155943
        25%         0.446187  0.273549
        50%         0.512456  0.866164
        75%         0.714380  0.881218
        max         0.804531  0.926368
B       count       5.000000       NaN
        mean        0.641817       NaN
        std         0.163022       NaN
        min         0.474867       NaN
        25%         0.475255       NaN
        50%         0.658282       NaN
        75%         0.791397       NaN
        max         0.809282       NaN
C       count            NaN  5.000000
        mean             NaN  0.735040
        std              NaN  0.194365
        min              NaN  0.470806
        25%              NaN  0.668021
        50%              NaN  0.690349
        75%              NaN  0.877549
        max              NaN  0.968477

你有你需要的结构,你可以把它写到文件中。

更新:

对于许多数据集,您可以在循环中使用上述逻辑,这样的事情应该可以工作:

out = pd.DataFrame(columns=['level_0', 'level_1'])
for i,df in enumerate([df1, df2], 1):
    out =df.describe().stack().unstack(0).stack().to_frame(f'Dataset_{i}').reset_index()\
            .merge(out, how='outer')
out = out.rename(columns={'level_0':'Methods', 'level_1':'Statistics'})\
    .set_index(['Methods', 'Statistics'])

推荐阅读