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')
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)
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,例如groupby: my_function(a,b) for a,b in iterator
小智 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)