簡體   English   中英

Pandas 數據框:如何將 describe() 應用於每個組並添加到新列?

[英]Pandas dataframe: how to apply describe() to each group and add to new columns?

df:

name score
A      1
A      2
A      3
A      4
A      5
B      2
B      4
B      6 
B      8

想要以下面的形式獲得以下新數據框:

   name count mean std min 25% 50% 75% max
    A     5    3    .. ..  ..  ..  ..  ..
    B     4    5    .. ..  ..  ..  ..  ..

如何從 df.describe() 中提取信息並重新格式化? 謝謝

還有一個更短的:)

print df.groupby('name').describe().unstack(1)

沒有什么能比得上單線:

在 [145] 中:

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

定義一些數據

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)

.

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

解決方案

這個問題的一個很好的方法是使用一個生成器表達式(見腳注)來允許pd.DataFrame()迭代groupby的結果,並動態構建匯總統計數據幀:

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

print(df2)

.

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

在這里, squeeze函數是擠出一個維度,將一列組匯總統計數據Dataframe轉換為Series

腳注:生成器表達式的形式為my_function(a) for a in iterator ,或者如果iterator返回tuples ,如groupby的情況: my_function(a,b) for a,b in iterator

沒有什么能比得上單線:

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

使用代碼

df.groupby('name').describe()

在此處輸入圖片說明

表存儲在名為df數據幀中

df= pd.read_csv(io.StringIO(data),delimiter='\s+')

只需指定列名並describe提供所需的輸出。 通過這種方式,您可以計算任何列

df.groupby('name')['score'].describe()
import pandas as pd
import io
import numpy as np

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+')

df2 = df.groupby('name').describe().reset_index().T.drop('name')
arr = np.array(df2).reshape((4,8))

df2 = pd.DataFrame(arr[1:], index=['name','A','B'])

print(df2)

這會給你 df2 為:

              0     1        2    3    4    5    6    7
    name  count  mean      std  min  25%  50%  75%  max
    A         5     3  1.58114    1    2    3    4    5
    B         4     5  2.58199    2  3.5    5  6.5    8

好吧,我設法得到了你想要的東西,但它的伸縮性不是很好。

import pandas as pd

name = ['a','a','a','a','a','b','b','b','b','b']
score = [1,2,3,4,5,2,4,6,8]

d = pd.DataFrame(zip(name,score), columns=['Name','Score'])
d = d.groupby('Name').describe()
d = d.reset_index()
df2 = pd.DataFrame(zip(d.level_1[8:], list(d.Score)[:8], list(d.Score)[8:]), columns = ['Name','A','B']).T

print df2

          0     1         2    3    4    5    6    7
Name  count  mean       std  min  25%  50%  75%  max
A         5     3  1.581139    1    2    3    4    5
B         4     5  2.581989    2  3.5    5  6.5    8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM