自定义描述或聚合而不使用 groupby

14

我想要使用groupby.agg函数,其中我的分组是整个数据框。 换句话说,我想使用agg功能,但不需要进行分组。我已经寻找了这方面的示例,但没有找到。

以下是我的操作:

import pandas as pd
import numpy as np

np.random.seed([3,1415])

df = pd.DataFrame(np.random.rand(6, 4), columns=list('ABCD'))
df

df

def describe(df):
    funcs = dict(Kurt=lambda x: x.kurt(),
                 Skew='skew',
                 Mean='mean',
                 Std='std')
    one_group = [True for _ in df.index]
    funcs_for_all = {k: funcs for k in df.columns}
    return df.groupby(one_group).agg(funcs_for_all).iloc[0].unstack().T

describe(df)

问题

我应该如何完成这个任务?

这里输入图片描述


2
我认为没有更好的替代方案:https://dev59.com/KmEh5IYBdhLWcg3wtFNE - ayhan
谢谢@ayhan。如果不是有希望的话,那也很有帮助。 - piRSquared
1
内置函数Dataframe.describe()怎么样?它不符合你的需求吗? - ysearka
@ysearka,很抱歉,它不包括偏度和峰度,并且由于进行了过多的计算而变慢。此外,我正在寻找一般解决方案。 - piRSquared
1
这是一个很好的问题,我花了很长时间才找到它。我想做SQL的select count(*), mean(foo) from bar的类比,它隐式地对所有内容进行分组,而没有显式的groupby。我有点惊讶你不能只是做bar.agg(...),但最终得到了与下面相同的解决方案。如果对谷歌有帮助,我搜索了像“pandas agg without groupby”或“pandas groupby overall entire dataframe”这样的东西。 - patricksurry
1个回答

15

我认为您可以对自己的提议进行一些小的改进,以提高可读性。具体而言,您可以利用 DataFrame.groupby() 函数接受 lambda 函数的特点来实现:

def describe(df):
    funcs = dict(Kurt=lambda x: x.kurt(),
                 Skew='skew',
                 Mean='mean',
                 Std='std')
    funcs_for_all = {k: funcs for k in df.columns}
    return df.groupby(lambda _ : True).agg(funcs_for_all).iloc[0].unstack().T

describe(df)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接