熊猫:合并多个describe()统计信息

时间:2020-10-30 12:59:47

标签: python pandas dataframe

pandas.DataFrame.describe函数沿其每个列计算DataFrame的统计信息:

foreach ($request->kids as $key => $value) {
    Kid::create([
        'fullname' => $value['fullname'],
        'age' => $value['age'],
    ]);
}

我有一个CSV文件目录,每个文件对应一个DataFrame。我想为每个这些DataFrame计算此统计信息,然后为整个目录输出组合的静态数据。我只需要 count / mean / min / max 。除了>>> s = pd.Series([1, 2, 3]) >>> s.describe() count 3.0 mean 2.0 std 1.0 min 1.0 25% 1.5 50% 2.0 75% 2.5 max 3.0 dtype: float64 将所有DataFrame在一起并在这个巨大的DataFrame上调用concat之外,还有什么好方法吗?

2 个答案:

答案 0 :(得分:1)

不是那么容易,添加了2种其他解决方案。差异具有均值,因为mean中不存在means,也使用count来排除缺失值,所以我更喜欢size方法:

np.random.seed(2020)
df = pd.DataFrame(np.random.randint(10, size=(3, 3)))
dfs = [df, df * 2, df * 3, df * 5]

list_of_summaries = [x.agg(['min','max','size', 'mean','count', 'sum']) for x in dfs]
df = pd.concat(list_of_summaries, axis=1) 
df = pd.DataFrame([df.loc['min'].min(level=0),
                   df.loc['max'].max(level=0),
                   df.loc['size'].sum(level=0),
                   df.loc['sum'].sum(level=0)])
df.loc['mean'] = df.loc['sum'].div(df.loc['size'])
df = df.drop('sum')
print (df)
              0          1     2
min    0.000000   3.000000   0.0
max   35.000000  40.000000  15.0
size  12.000000  12.000000  12.0
mean  11.916667  17.416667   5.5

df1 = (pd.concat(list_of_summaries, axis=1)
         .T
         .groupby(level=0)
         .agg({'min':'min', 'max':'max', 'size':'sum', 'sum':'sum'})
         .T)
df1.loc['mean'] = df1.loc['sum'].div(df.loc['size'])
df1 = df1.drop('sum')
print (df1)
              0          1     2
min    0.000000   3.000000   0.0
max   35.000000  40.000000  15.0
size  12.000000  12.000000  12.0
mean  11.916667  17.416667   5.5

import functools
import pandas as pd

def reduce_(a, b):
    return pd.DataFrame([
        pd.concat([a.loc['min'], b.loc['min']], axis=1).min(axis=1),
        pd.concat([a.loc['max'], b.loc['max']], axis=1).max(axis=1),
        pd.concat([a.loc['count'], b.loc['count']], axis=1).sum(axis=1),
        pd.concat([a.loc['mean'], b.loc['mean']], axis=1).mean(axis=1),
    ], index=['min', 'max', 'count', 'mean'])

assert len(list_of_summaries) > 0
summary_of_summaries = functools.reduce(reduce_, list_of_summaries)

print (summary_of_summaries)
               0          1      2
min     0.000000   3.000000   0.00
max    35.000000  40.000000  15.00
count  12.000000  12.000000  12.00
mean   15.708333  22.958333   7.25

答案 1 :(得分:0)

这是我目前拥有的最好方法,不需要将所有数据组合到一个巨大的DataFrame中。它不是很可读或效率很高,但我不妨发布它以明确我的需求:

byte[]

这里的困难本质上是我需要为每行不同的运算符知道吗?