Pandas数据帧:如何将describe()应用于每个组并添加到新列?

Rob*_*988 14 python numpy dataframe pandas

DF:

name score
A      1
A      2
A      3
A      4
A      5
B      2
B      4
B      6 
B      8
Run Code Online (Sandbox Code Playgroud)

想以下面的形式获得以下新数据框:

   name count mean std min 25% 50% 75% max
    A     5    3    .. ..  ..  ..  ..  ..
    B     4    5    .. ..  ..  ..  ..  ..
Run Code Online (Sandbox Code Playgroud)

如何从df.describe()中提取信息并重新格式化?谢谢

And*_*sev 18

甚至还有一个更短的:)

print df.groupby('name').describe().unstack(1)
Run Code Online (Sandbox Code Playgroud)

没有什么比单线更好:

在[145]中:

print df.groupby('name').describe().reset_index().pivot(index ='name',values ='score',columns ='level_1')

  • print df.groupby('name').describe().unstack(1).reset_index() 很有用 (3认同)

CT *_*Zhu 13

没有什么比单线更好:

In [145]:

print df.groupby('name').describe().reset_index().pivot(index='name', values='score', columns='level_1')

level_1  25%  50%  75%  count  max  mean  min       std
name                                                   
A        2.0    3  4.0      5    5     3    1  1.581139
B        3.5    5  6.5      4    8     5    2  2.581989
Run Code Online (Sandbox Code Playgroud)


Ped*_*rte 7

定义一些数据

In[1]:
import pandas as pd
import io

data = """
name score
A      1
A      2
A      3
A      4
A      5
B      2
B      4
B      6
B      8
    """

df = pd.read_csv(io.StringIO(data), delimiter='\s+')
print(df)
Run Code Online (Sandbox Code Playgroud)

Out[1]:
  name  score
0    A      1
1    A      2
2    A      3
3    A      4
4    A      5
5    B      2
6    B      4
7    B      6
8    B      8
Run Code Online (Sandbox Code Playgroud)

解决此问题的一种好方法是使用生成器表达式(请参见脚注)pd.DataFrame()来迭代的结果groupby,并动态构建摘要统计数据框:

In[2]:
df2 = pd.DataFrame(group.describe().rename(columns={'score':name}).squeeze()
                         for name, group in df.groupby('name'))

print(df2)
Run Code Online (Sandbox Code Playgroud)

Out[2]:
   count  mean       std  min  25%  50%  75%  max
A      5     3  1.581139    1  2.0    3  4.0    5
B      4     5  2.581989    2  3.5    5  6.5    8
Run Code Online (Sandbox Code Playgroud)

此处,squeeze函数压缩维度,以将单列组摘要统计信息Dataframe转换为Series

脚注:生成器表达式的形式为my_function(a) for a in iterator,或者如果iterator给我们返回两个元素tuples,例如groupbymy_function(a,b) for a,b in iterator


小智 7

使用代码

df.groupby('name').describe()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


小智 5

表存储在名为 df

df= pd.read_csv(io.StringIO(data),delimiter='\s+')
Run Code Online (Sandbox Code Playgroud)

只需指定列名并describe为您提供所需的输出。通过这种方式,您可以计算任何列

df.groupby('name')['score'].describe()
Run Code Online (Sandbox Code Playgroud)