【Python数据分析】Pandas_groupby分组操作


在数据分析中,经常会遇到这样的情况:根据某一列(或多列)标签把数据划分为不同的组别,然后再对其进行数据分析。比如,某网站对注册用户的性别或者年龄等进行分组,从而研究出网站用户的画像(特点)。在 Pandas 中,要完成数据的分组操作,需要使用 groupby() 函数,它和 SQL 的 GROUP BY操作非常相似。

在划分出来的组(group)上应用一些统计函数,从而达到数据分析的目的,比如对分组数据进行聚合、转换,或者过滤。这个过程主要包含以下三步:

  • 拆分(Spliting):表示对数据进行分组;
  • 应用(Applying):对分组数据应用聚合函数,进行相应计算;
  • 合并(Combining):最后汇总计算结果。

下面对 groupby() 函数的应用过程进行具体的讲解。

首先我们创建一个 DataFrame 对象,下面数据描述了某班学生,计算机选修课的考试成绩:

import pandas as pd 
import numpy as np 
data = {'Name': ['John', 'Helen', 'Sona', 'Ella'],  
        'score': [82, 98, 91, 87],    
        'option_course': ['C#','Python','Java','C']} 
df = pd.DataFrame(data)
print(df)  

输出结果:

    Name  score   option_course
0   John     82            C#
1  Helen     98        Python
2   Sona     91          Java
3   Ella     87             C

创建groupby分组对象

使用 groupby() 可以沿着任意轴分组。您可以把分组时指定的键(key)作为每组的组名,方法如下所示:

  • df.groupby(“key”)
  • df.groupby(“key”,axis=1)
  • df.groupby([“key1”,“key2”])

通过上述方法对 DataFrame 对象进行分组操作:

import pandas as pd
import numpy as np
data = {'Name': ['John', 'Helen', 'Sona', 'Ella'],   
        'score': [82, 98, 91, 87], 
        'option_course': ['C#','Python','Java','C']}
df = pd.DataFrame(data)
print(df)
#生成分组groupby对象
print(df.groupby('score'))

输出结果:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000021DE9A89640>

查看分组结果

1) groups查看分组结果

通过调用groups属性查看分组结果:

import pandas as pd
import numpy as np
data = {'Name': ['John', 'Helen', 'Sona', 'Ella'],   
        'score': [82, 98, 91, 87],   
        'option_course': ['C#','Python','Java','C']}
df = pd.DataFrame(data)
#查看分组
print(df.groupby('score').groups)

输出结果:

{82: Int64Index([0], dtype='int64'), 
87: Int64Index([3], dtype='int64'), 
91: Int64Index([2], dtype='int64'), 
98: Int64Index([1], dtype='int64')}
2) 多个列标签分组

当然也可以指定多个列标签进行分组,示例如下:

import pandas as pd
import numpy as np
data = {'Name': ['John', 'Helen', 'Sona', 'Ella'],  
        'score': [82, 98, 91, 87],   
        'option_course': ['C#','Python','Java','C']}
df = pd.DataFrame(data)
#查看分组
print(df.groupby(['Name','score']).groups)

输出结果:

{('Ella', 87): Int64Index([3], dtype='int64'), 
('Helen', 98): Int64Index([1], dtype='int64'), 
('John', 82): Int64Index([0], dtype='int64'), 
('Sona', 91): Int64Index([2], dtype='int64')}

通过 get_group() 方法可以选择组内的具体数据项:

import pandas as pd
import numpy as np
data = {'Name': ['John', 'Helen', 'Sona', 'Ella'],
   'score': [82, 98, 91, 87],
   'option_course': ['C#','Python','Java','C']}
df = pd.DataFrame(data)
#根据score来分组
grouped=df.groupby('score')
#根据对应组的数据值,选择一个组
print(grouped.get_group(91))

输出结果:

   Name  score option_course
2  Sona     91          Java

遍历分组数据

通过以下方法来遍历分组数据,示例如下:

import pandas as pd
import numpy as np
data = {'Name': ['John', 'Helen', 'Sona', 'Ella'],
   'score': [82, 98, 91, 87],
   'option_course': ['C#','Python','Java','C']}
df = pd.DataFrame(data)
#查看分组
grouped=df.groupby('score')
for label, option_course in grouped:
#其中key代表分组后字典的键,也就是score
    print(label)
#字典对应的值选修的科目
    print(option_course)

输出结果:

82
   Name  score   option_course
0  John     82            C#
87
   Name  score   option_course
3  Ella     87             C
91
   Name  score   option_course
2  Sona     91          Java
98
    Name  score  option_course
1  Helen     98        Python

如上所示, groupby 对象的组名称与 score 中的的元素值一一对应。

应用聚合函数

当您在创建 groupby 对象时,通过 agg() 函数可以对分组对象应用多个聚合函数:

import pandas as pd 
import numpy as np 
data = {'name': ['John', 'Helen', 'Sona', 'Ella'], 
   'score': [82, 98, 91, 87], 
   'option_course': ['C#','Python','Java','C']} 
df = pd.DataFrame(data)
grouped=df.groupby('name')
#应用一个聚合函数求均值
print(grouped['score']).agg(np.mean)

输出结果:

name
Ella     87
Helen    98
John     82
Sona     91
Name: score, dtype: int64

当然,您也可以一次性应有多个聚合函数,示例如下:

import pandas as pd
import numpy as np
data = {'name': ['John', 'Helen', 'Sona', 'Ella'],
   'score': [82, 98, 91, 87],
   'option_course': ['C#','Python','Java','C']}
df = pd.DataFrame(data)
grouped=df.groupby('name')
print(grouped['score'].agg([np.size,np.mean,np.std]))

输出结果:

       size  mean  std
name                 
Ella      1    87  NaN
Helen     1    98  NaN
John      1    82  NaN
Sona      1    91  NaN

组的转换操作

在组的行或列上可以执行转换操作,最终会返回一个与组大小相同的索引对象。示例如下:

import pandas as pd
import numpy as np
df = pd.DataFrame({'种类':['水果','水果','水果','蔬菜','蔬菜','肉类','肉类'],
                '产地':['朝鲜','中国','缅甸','中国','菲律宾','韩国','中国'],
                '水果':['橘子','苹果','哈密瓜','番茄','椰子','鱼肉','牛肉'],
                '数量':[3,5,5,3,2,15,9],
                '价格':[2,5,12,3,4,18,20]})
#分组求均值,水果、蔬菜、肉类
#对可执行计算的数值列求均值
print(df.groupby('种类').transform(np.mean))
#transform()直接应用demean,实现去均值操作
demean = lambda arr:arr-arr.mean()
print(df.groupby('种类').transform(demean))
#自定义函数
# 返回分组的前n行数据
def get_rows(df,n): 
     #从1到n行的所有列
    return df.iloc[:n,:]
#分组后的组名作为行索引
print(df.groupby('种类').apply(get_rows,n=1))

输出结果:

      数量         价格
0   4.333333   6.333333
1   4.333333   6.333333
2   4.333333   6.333333
3   2.500000   3.500000
4   2.500000   3.500000
5  12.000000  19.000000
6  12.000000  19.000000

      数量        价格
0 -1.333333 -4.333333
1  0.666667 -1.333333
2  0.666667  5.666667
3  0.500000 -0.500000
4 -0.500000  0.500000
5  3.000000 -1.000000
6 -3.000000  1.000000

      种类  产地  水果  数量  价格
种类                     
水果 0  水果  朝鲜  橘子   3   2
肉类 5  肉类  韩国  鱼肉  15  18
蔬菜 3  蔬菜  中国  番茄   3   3

组的数据过滤操作

通过 filter() 函数可以实现数据的筛选,该函数根据定义的条件过滤数据并返回一个新的数据集。

下面,筛选出参加比赛超过两次的球队(包含两次):

import pandas as pd
import numpy as np
data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
   'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
   'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
   'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
   'Points':[874,789,863,663,741,802,756,788,694,701,812,698]}
df = pd.DataFrame(data)
#定义lambda函数来筛选数据
print (df.groupby('Team').filter(lambda x: len(x) >= 2))

输出结果:

      Team  Rank  Year  Points
0   Riders     1  2014     874
1   Riders     2  2015     789
4    Kings     3  2014     741
6    Kings     1  2016     756
7    Kings     1  2017     788
8   Riders     2  2016     694
11  Riders     2  2017     698

参考:C语言中文网

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python数据分析中,pandas是一个非常重要的库,它提供了一种灵活、高效、易用的数据结构,可以帮助我们进行数据清洗、数据处理、数据分析等工作。下面是一些pandas实例: 1. 读取数据:pandas可以读取多种格式的数据,如csv、excel、json等。使用read_csv、read_excel、read_json等函数可以读取相应格式的数据文件。 2. 数据清洗:pandas可以帮助我们清洗数据,如去除重复值、处理缺失值、替换异常值等。使用drop_duplicates、dropna、fillna、replace等函数可以实现相应的功能。 3. 数据分组pandas可以将数据按照某些条件进行分组,然后对每组数据进行统计分析。使用groupby函数可以实现数据分组。 4. 数据聚合:pandas可以对数据进行聚合操作,如求和、求平均值、求最大值、求最小值等。使用sum、mean、max、min等函数可以实现相应的聚合操作。 5. 数据合并:pandas可以将多个数据集合并成一个数据集,可以按照某些条件进行合并。使用merge、concat等函数可以实现数据合并。 6. 数据可视化:pandas可以将数据进行可视化展示,如绘制柱状图、折线图、散点图等。使用plot函数可以实现数据可视化。 以上是一些pandas实例,希望对你有所帮助。 ### 回答2: Python数据分析的关键点之一是数据可以以各种方式被处理和探索。对于数据处理,Pandas是一个非常有用的Python库,它提供了各种功能和方法来处理不同类型的数据。 Pandas 对于大数据集提供了广泛的支持,使其能够在实践中使用。让我们来看一些Python数据分析Pandas实例,了解Pandas的主要功能和应用。 1. 读取数据 在Python中使用Pandas库导入数据集是很简单的。我们可以使用 read_csv() 函数来读取csv文件, read_excel() 函数来读取Excel文件等等。例如,以下代码可以读取CSV格式的数据: import pandas as pd data = pd.read_csv("data.csv") 2. 数据清洗 在数据的每个行或列中,我们有时会遇到缺失值或不必要的数据。在这种情况下,我们可以使用 Pandas 来清洗数据。以下是一些数据清洗的示例: # 删除列 data = data.drop('column_name', axis=1) # 删除行 data = data.drop(data.index[[0,1,2]]) # 替换NaN值 data = data.fillna(method="ffill") # 去除重复值 data = data.drop_duplicates() 3. 数据分组和聚合 Pandas库提供了一些函数来处理分组和聚合数据。Pandas中的groupby()方法可以将数据按照一个或多个列进行分组。以下是一些数据分组和聚合的示例: # 按照列分组 grouped = data.groupby('column_name') # 按照多列分组 grouped = data.groupby(['col1', 'col2']) # 聚合 aggregated = grouped.aggregate(np.sum) 4. 数据可视化 数据可视化是数据分析的最重要环节之一。在Pandas中,提供了许多有用的可视化工具。因此,我们可以在我们的分析中使用这些库来更好地理解数据。以下是一些数据可视化的示例: # 绘制柱状图 data.plot(kind='bar') # 绘制折线图 data.plot(kind='line') # 绘制散点图 data.plot(kind='scatter') 总结 在Python数据分析中,Pandas是一个强大的工具,可以让我们方便、高效地处理、分析和探索数据。通过将数据读入Pandas,清洗数据,聚合数据并将结果可视化,我们可以更好地理解和分析数据集。以上是一些Python数据分析Pandas实例的简单介绍,希望能够对你在数据分析方面有所帮助。 ### 回答3: Python是一种非常流行的编程语言,适用于各种数据分析和科学计算。PandasPython的一个开源库,广泛用于数据分析和数据处理。Pandas提供了许多数据结构和函数,使得数据分析操作变得更加方便和高效。 Pandas的主要数据结构是Series和DataFrame。Series是一维数据结构,类似于Python的列表,但具有更多的功能,例如索引、行标签和数据类型等。DataFrame是二维数据结构,类似于电子表格,包含多个列和行,每列可以有不同的数据类型。 Pandas提供了多种操作数据的函数和方法,例如处理缺失值、删除重复行、拆分和合并数据等。其中,处理缺失值是数据分析中常见的问题之一,Pandas提供了fillna和dropna两个函数来处理缺失值。fillna函数用于用指定的值或方法填充缺失值,而dropna函数可以删除包含缺失值的行或列。 除了数据预处理,Pandas还支持各种数据分析和绘图功能。例如,可以使用groupby函数按组分析数据,使用pivot_table函数创建数据透视表,使用merge函数合并数据集,还可以使用plot函数绘制各种图表,例如直方图、折线图和散点图等。 总的来说,PandasPython数据分析的重要工具之一,它提供了丰富的功能和易用的API,使得数据分析变得更加高效和方便。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值