【数据处理包Pandas】分组及相关操作

目录

    • 一、初步认识分组并查看分组信息
      • (一)通过聚合函数查看分组信息
      • (二)转换成列表查看所有组的信息
      • (三)通过循环查看各组的名称和组中的数据信息
      • (四)通过get_group()方法直接获得一组数据
    • 二、分组再认识
    • 三、分组的执行过程
      • (一)split阶段:创建分组的常见形式
      • (二)应用阶段:对数据进行必要的处理和变换
    • 四、重点学习agg、filter、transform和apply函数的使用
      • (一)agg函数的用法
      • (二)filter函数的用法
      • (三)transform函数的用法
      • (四)apply函数的用法


准备工作

import numpy as np
import pandas as pd
%matplotlib inline

数据集team.xlsx下载地址:下载team.xlsx

df = pd.read_excel("team.xlsx")
df.head()

在这里插入图片描述

# 分组前总体统计情况
df.describe()

在这里插入图片描述

一、初步认识分组并查看分组信息

team列分组,team列中值相同的记录构成一组,但是不做聚合计算或其他操作,看不到分组结果。

df.groupby('team')

df.groupby('team')等价于df.groupby(df['team'])或者df.groupby(df.team)(当列名是字符串时两者等价)。

<pandas.core.groupby.DataFrameGroupBy object at 0x000001BAC3370668>

(一)通过聚合函数查看分组信息

df.groupby('team').mean()

可见分组信息类似于 DataFrame,但其实它是 DataFrameGroupBy 对象。它以分组字段作为行索引,而列索引则包含所有可以求均值的那些列(name字段不能求均值,被舍弃了)。

在这里插入图片描述

tm = df.groupby('team').mean()
tm.plot()
<matplotlib.axes._subplots.AxesSubplot at 0xba3ba58>

在这里插入图片描述

查看每组前2条记录:

df.groupby('team').head(2)

在这里插入图片描述

查看每组后2条记录:

df.groupby('team').tail(2)

在这里插入图片描述

(二)转换成列表查看所有组的信息

每一组信息形成列表中的一个元组,元组的第一个元素是组名,第2个元素是一个包含数据的 DataFrame。

list(df.groupby('team'))
[('A',        name team  Q1  Q2  Q3  Q42       Ack    A  57  60  18  847      Lfie    A   9  10  99  379     Oscar    A  77   9  26  6716   Joshua    A  63   4  80  3017    Henry    A  91  15  75  1720    Lucas    A  60  41  77  6222   Arthur    A  44  53  42  4034  Reggie1    A  30  12  23   940     Toby    A  52  27  17  6842    Dylan    A  86  87  65  2051    Hugo0    A  28  25  14  7167    Caleb    A  64  34  46  8870   Nathan    A  87  77  62  1371    Blake    A  78  23  93   975  Stanley    A  69  71  39  9779    Tyler    A  75  16  44  6388    Aaron    A  96  75  55   8), ('B',         name team  Q1  Q2  Q3  Q46       Acob    B  61  95  94   810       Leo    B  17   4  33  7911     Logan    B   9  89  35  6514    Thomas    B  80  48  56  4125  Harrison    B  89  13  18  7530    Edward    B  57  38  86  8735    Samuel    B   9  38  88  6638    Elijah    B  97  89  15  4639    Harley    B   2  99  12  1350    Jenson    B  66  77  88  7453   Frankie    B  18  62  52  3356     David    B  21  47  99   258     Lewis    B   4  34  77  2860    Ronnie    B  53  13  34  9964   Harvey2    B  43  76  87  9077   Michael    B  89  21  59  9278   Elliott    B   9  31  33  6083   Albert0    B  85  38  41  1784       Kai    B  66  45  13  4885      Liam    B   2  80  24  2592  Grayson7    B  59  84  74  3393    Jamie0    B  39  97  84  55), ('C',          name team  Q1  Q2  Q3  Q41        Arry    C  36  37  37  573       Eorge    C  93  96  71  785      Harlie    C  24  13  87  4312     Archie    C  83  89  59  6813       Theo    C  51  86  87  2718    William    C  80  68   3  2628     Daniel    C  50  50  72  6132  Alexander    C  91  76  26  7933       Adam    C  90  32  47  3937  Sebastian    C   1  14  68  4846      Tommy    C  29  44  28  7647      Jake3    C  69  23  11  4054     Ollie3    C  10  76  30  3662    Matthew    C  44  33  41  9873     Elliot    C  15  17  76  2281      Ellis    C  34  34  77  4286      Calum    C  14  91  16  8287     Louis2    C  13  94  51  2291     Connor    C  62  38  63  4695    Gabriel    C  48  59  87  7496    Austin7    C  21  31  30  4397   Lincoln4    C  98  93   1  20), ('D',          name team  Q1  Q2  Q3  Q44         Oah    D  65  49  61  868      Reddie    D  64  93  57  7221      Ethan    D  79  45  89  8823      Mason    D  80  96  26  4927     Finley    D  62  73  84  6844   Benjamin    D  15  88  52  2548      Louie    D  24  84  54  1149    Carter7    D  57  52  77  5052     Bobby1    D  50  55  60  5957     Albie1    D  79  82  56  9659       Luca    D   5  40  91  8363       Alex    D  14  70  55  8765     Reuben    D  70  72  76  5666    Jayden6    D  64  21  10  2168    Hunter3    D  38  80  82  4069  Theodore3    D  43   7  68  8072      Luke6    D  15  97  95  9989       Ezra    D  16  56  86  6194      Aiden    D  20  31  62  68), ('E',         name team  Q1  Q2  Q3  Q40      Liver    E  89  21  24  6415     James    E  48  77  52  1119       Max    E  97  75  41   324     Isaac    E  74  23  28  6526     Teddy    E  71  91  21  4829     Riley    E  35  26  59  8331    Joseph    E  67  87  87  9336     Jaxon    E  88  98  19  9841     Arlo8    E  48  34  52  5143      Jude    E   8  45  13  6545     Rory9    E   8  12  58  2755   Zachary    E  12  71  85  9361  Jackson5    E   6  10  15  3374     Roman    E  73   1  25  4476    Dexter    E  73  94  53  2080      Ryan    E  92  70  64  3182      Finn    E   4   1  55  3290      Leon    E  38  60  31   798       Eli    E  11  74  58  9199       Ben    E  21  43  41  74)]

再通过索引得到第一组的数据:

list(df.groupby('team'))[0][1]

在这里插入图片描述

此示例中每一组数据的类型都是一个 DataFrame,其他情况下也有可能是 Series。

type(list(df.groupby('team'))[0][1])
pandas.core.frame.DataFrame

(三)通过循环查看各组的名称和组中的数据信息

也可以通过循环查看各组的名称和组中的数据信息(每个分组其实形成了一个包含组名和组信息的元组,见上面示例)。

for group_name,group_info in df.groupby('team'):print(group_name)print(group_info.head())
Aname team  Q1  Q2  Q3  Q4
2      Ack    A  57  60  18  84
7     Lfie    A   9  10  99  37
9    Oscar    A  77   9  26  67
16  Joshua    A  63   4  80  30
17   Henry    A  91  15  75  17
Bname team  Q1  Q2  Q3  Q4
6       Acob    B  61  95  94   8
10       Leo    B  17   4  33  79
11     Logan    B   9  89  35  65
14    Thomas    B  80  48  56  41
25  Harrison    B  89  13  18  75
Cname team  Q1  Q2  Q3  Q4
1     Arry    C  36  37  37  57
3    Eorge    C  93  96  71  78
5   Harlie    C  24  13  87  43
12  Archie    C  83  89  59  68
13    Theo    C  51  86  87  27
Dname team  Q1  Q2  Q3  Q4
4      Oah    D  65  49  61  86
8   Reddie    D  64  93  57  72
21   Ethan    D  79  45  89  88
23   Mason    D  80  96  26  49
27  Finley    D  62  73  84  68
Ename team  Q1  Q2  Q3  Q4
0   Liver    E  89  21  24  64
15  James    E  48  77  52  11
19    Max    E  97  75  41   3
24  Isaac    E  74  23  28  65
26  Teddy    E  71  91  21  48

(四)通过get_group()方法直接获得一组数据

df.groupby('team').get_group('E').tail()

在这里插入图片描述

二、分组再认识

The abstract definition of grouping is to provide a mapping of labels to group names
from: https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html

分组本质上提供了标签(行索引)到组名的一个映射, 利用groups属性可以看到这种多对一的映射关系。

df.groupby('team').groups
{'A': Int64Index([2, 7, 9, 16, 17, 20, 22, 34, 40, 42, 51, 67, 70, 71, 75, 79, 88], dtype='int64'),'B': Int64Index([ 6, 10, 11, 14, 25, 30, 35, 38, 39, 50, 53, 56, 58, 60, 64, 77, 78,83, 84, 85, 92, 93],dtype='int64'),'C': Int64Index([ 1,  3,  5, 12, 13, 18, 28, 32, 33, 37, 46, 47, 54, 62, 73, 81, 86,87, 91, 95, 96, 97],dtype='int64'),'D': Int64Index([4, 8, 21, 23, 27, 44, 48, 49, 52, 57, 59, 63, 65, 66, 68, 69, 72,89, 94],dtype='int64'),'E': Int64Index([0, 15, 19, 24, 26, 29, 31, 36, 41, 43, 45, 55, 61, 74, 76, 80, 82,90, 98, 99],dtype='int64')}

三、分组的执行过程

分组的执行过程——Group by: split-apply-combine

  • split:按照某一原则(groupby字段)进行拆分,相同属性分为一组
  • apply:对拆分后的各组执行相应的转换操作
  • combine:输出汇总转换后的各组结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

图片来源:Pandas之超好用的Groupby用法详解(https://zhuanlan.zhihu.com/p/101284491?utm_source=wechat_session)

使用的重点在于 split 和 apply

(一)split阶段:创建分组的常见形式

groupby方法的原型:

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=<object object>, observed=False, dropna=True)

  • by:指定分组标准,可以是字符串、字符串列表、字典或者 Series、Numpy 数组或函数
  • axis:指定分组方向是按行分组还是按列分组,默认是按行分组(对记录分组)
  • level:在包含多级索引的 DataFrame 分组时,用于指定使用哪一级索引进行分组
  • as_index:是否把分组键(就是分组的标准)作为分组后的组索引,默认为True
  • sort:分组后是否按分组键的顺序对分组结果进行排序,默认为True
  • group_keys:在应用阶段(apply)是否把分组键加入到索引中,默认为True
  • dropna:在分组时是否把键值为 NA 的行或列丢弃,默认为True

1、按字符串列表分组

按团队和姓名首字母分组,会产生多级索引。

df.groupby(['team',df['name'].str[0]]).mean()

注意:此时的df['name']不能简化成'name',但可以写成df.name

在这里插入图片描述

2、字典作为分组的标准

假设把上述 Excel 记录看成是学生信息,其中0至9号学生属于1班,20至39号属于2班…同一班的学生可以属于不同的team。下面首先通过字典推导式建立1班对应的字典。

i = 0
{j:str(i+1)+'班' for j in range(i*20,(i+1)*20)}
{0: '1班',1: '1班',2: '1班',3: '1班',4: '1班',5: '1班',6: '1班',7: '1班',8: '1班',9: '1班',10: '1班',11: '1班',12: '1班',13: '1班',14: '1班',15: '1班',16: '1班',17: '1班',18: '1班',19: '1班'}

按字典分组:先产生分组字典,再进行分组。

g = []
# 以连续的20条记录的索引为键值对应一个班,产生一个包含5个班的列表,每个班对应一个字典
for i in range(5): g.append({j:str(i+1)+'班' for j in range(i*20,(i+1)*20)})
# 将列表中的5个字典合并成一个大字典
d = {}
for i in range(5):d.update(g[i])
# print(d)
# 用这个大字典进行分组,每一条记录的行索引通过字典的键映射到相应的组
df.groupby(d).mean()

在这里插入图片描述

3、按Series分组

先产生作为分组标准的 Series 对象,再进行分组。

s = pd.Series(index=np.arange(100))
for i in range(5):s[i*20:(i+1)*20]=str(i+1)+'班'
df.groupby(s).mean()

在这里插入图片描述

4、按Numpy数组分组

先产生作为分组标准的 Numpy 数组,再进行分组。分组时将df的行索引与 Numpy 数组的索引相匹配。

n = np.array(s)
df.groupby(n).mean()

在这里插入图片描述

试试as_index=False的效果:

df.groupby(n,as_index=False).mean()

在这里插入图片描述

5、按函数值分组

list(df.groupby(lambda x:x[0]=='Q',axis='columns'))   # axis='columns'等价于axis=1
[(False,         name team0      Liver    E1       Arry    C2        Ack    A3      Eorge    C4        Oah    D5     Harlie    C6       Acob    B7       Lfie    A8     Reddie    D9      Oscar    A10       Leo    B11     Logan    B12    Archie    C13      Theo    C14    Thomas    B15     James    E16    Joshua    A17     Henry    A18   William    C19       Max    E20     Lucas    A21     Ethan    D22    Arthur    A23     Mason    D24     Isaac    E25  Harrison    B26     Teddy    E27    Finley    D28    Daniel    C29     Riley    E..       ...  ...70    Nathan    A71     Blake    A72     Luke6    D73    Elliot    C74     Roman    E75   Stanley    A76    Dexter    E77   Michael    B78   Elliott    B79     Tyler    A80      Ryan    E81     Ellis    C82      Finn    E83   Albert0    B84       Kai    B85      Liam    B86     Calum    C87    Louis2    C88     Aaron    A89      Ezra    D90      Leon    E91    Connor    C92  Grayson7    B93    Jamie0    B94     Aiden    D95   Gabriel    C96   Austin7    C97  Lincoln4    C98       Eli    E99       Ben    E[100 rows x 2 columns]), (True,     Q1  Q2  Q3  Q40   89  21  24  641   36  37  37  572   57  60  18  843   93  96  71  784   65  49  61  865   24  13  87  436   61  95  94   87    9  10  99  378   64  93  57  729   77   9  26  6710  17   4  33  7911   9  89  35  6512  83  89  59  6813  51  86  87  2714  80  48  56  4115  48  77  52  1116  63   4  80  3017  91  15  75  1718  80  68   3  2619  97  75  41   320  60  41  77  6221  79  45  89  8822  44  53  42  4023  80  96  26  4924  74  23  28  6525  89  13  18  7526  71  91  21  4827  62  73  84  6828  50  50  72  6129  35  26  59  83..  ..  ..  ..  ..70  87  77  62  1371  78  23  93   972  15  97  95  9973  15  17  76  2274  73   1  25  4475  69  71  39  9776  73  94  53  2077  89  21  59  9278   9  31  33  6079  75  16  44  6380  92  70  64  3181  34  34  77  4282   4   1  55  3283  85  38  41  1784  66  45  13  4885   2  80  24  2586  14  91  16  8287  13  94  51  2288  96  75  55   889  16  56  86  6190  38  60  31   791  62  38  63  4692  59  84  74  3393  39  97  84  5594  20  31  62  6895  48  59  87  7496  21  31  30  4397  98  93   1  2098  11  74  58  9199  21  43  41  74[100 rows x 4 columns])]

split阶段的几种做法如下:

(1)先分组再选择列最后计算:

推荐此种做法,便于与agg/transform/apply等应用阶段的写法相统一。

print(type(df.groupby('team')[['Q1','Q2']]))  # groupby之后没有做计算还是DataFrameGroupBy对象
df.groupby('team')[['Q1','Q2']].mean()   

注意:上面的[['Q1','Q2']]不能写成['Q1':'Q2']这种切片形式,要使用切片就得写成.loc[:,'Q1':'Q2']的形式。

在这里插入图片描述

(2)先分组再计算最后选择列:

print(type(df.groupby('team').mean()))   # groupby之后做了计算,就变成了DataFrame对象
df.groupby('team').mean()[['Q1','Q2']]

在这里插入图片描述

(3)先选择列再分组最后计算:

groupby中给出分组键是字符串时,选择的列一定要包含分组键涉及的字段。

df[['team','Q1','Q2']].groupby('team').mean()  

在这里插入图片描述

与上面一句完全等价,但groupby中给出分组键的不是字符串而是 Series,此时选择列时可以不包含分组键。

df[['Q1','Q2']].groupby(df['team']).mean()   

在这里插入图片描述

(二)应用阶段:对数据进行必要的处理和变换

分组后,可以对组对象应用多种聚合函数,实现对每组数据的统计计算。所谓聚合,是指任何能够从数组产生标量值的数据转换过程。

常见的聚合函数包括:

在这里插入图片描述
注意size与count的区别:前者计数时包含NaN值,而后者计数则不包含NaN值

df.groupby('team').nth(0)   # 返回每组的第1个,注意从0开始,等价于df.groupby('team').first() 

在这里插入图片描述

df.groupby('team').describe()    # 每组记录数、均值、标准差、最小值、分位数和最大值

在这里插入图片描述

四、重点学习agg、filter、transform和apply函数的使用

(一)agg函数的用法

agg(等价于aggregation)函数的用法:对各组应用特定的聚合函数

以下三种写法等价:

df.groupby('team').agg(np.mean)    # 调用np.mean()函数,相当于每组记录看成一个Numpy数组,agg对数组应用特定的函数
# df.groupby('team').agg('mean')    # 使用字符串
# df.groupby('team').mean()         # 不使用agg函数,直接调用聚合函数

在这里插入图片描述

相比于直接调用聚合函数,agg函数更强大之处在于:

(1)允许同时做多种计算

此时agg的参数是列表,计算结果会产生多级的列索引,并且索引名一般用列表中的函数名(或与之相关)。

df.groupby('team').agg([np.max,np.min])  # 结果中的amax表示np.array中的max

在这里插入图片描述

不想使用自动提供的列名,而希望自定义列名,可以把agg参数中的列表元素改成元组,计算结果同样会产生多级的列索引。
元组的第1个元素是自定义的列名(作为第2级列索引出现),第2个元素是函数名,给出了要对分组后的该列数据所做的运算。

df.groupby('team').agg([('max_test','max'),('min_test',np.min)])

在这里插入图片描述

agg函数更强大之处在于:

(2)允许同时对不同的列做不同的计算,此时agg的参数是字典

使用rename函数对结果列重命名:

df.groupby('team').agg({'Q1':np.sum,'Q3':np.mean}).rename(columns={'Q1':'sum(Q1)','Q3':'mean(Q3)'})

等价的写法:如果不用np为前缀的聚合函数,则要使用字符串。

df.groupby('team').agg({'Q1':'sum','Q3':'mean'}).rename(columns={'Q1':'sum(Q1)','Q3':'mean(Q3)'})

在这里插入图片描述

agg函数更强大之处在于:

(3)允许自定义函数实现对每组对象进行聚合操作,此时agg的参数是自定义的聚合函数

df.groupby('team').agg(lambda x: x.median()-x.mean())  # 中位数(50%)减去均值

在这里插入图片描述

注意
(1)agg函数返回的是一个聚合后的标量值
(2)虽然agg允许调用用户自定义的聚合函数,但如果能用已有的聚合函数,尽量用已有的,因为做过性能优化!

(二)filter函数的用法

filter函数用于对分组进行过滤(类似于SQL中的having子句),返回满足过滤条件的分组中的记录,其参数必须是函数。

注意:当组对象存在多列时,filter的过滤条件要求显式的指定某一列。

df.groupby('team').filter(lambda x: x['Q1'].sum()>1000)

在这里插入图片描述

(三)transform函数的用法

transform函数的作用可以概括为:基于所属组的统计信息对组中的每条记录进行变换,其参数也要求是函数
参考:https://zhuanlan.zhihu.com/p/101284491

transform函数常用于分组进行数据标准化以及缺失值填充
参考:https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html

transform执行时是对分组块(Excel 筛选功能可以更直观看到每个分组块)逐列进行的,返回的结果与分组块的大小相同

df.groupby('team').transform(lambda x: x.mean()).head(10)

因为是按列进行的,因此上述lambda函数的参数x应该理解为表示分组块的每一列,所以函数体中不应该再出现列名。

在这里插入图片描述

示例:假设原始数据表示每人四个季度的奖金情况,要求依据每组Q4均值的1.2倍设置每人的年终奖金。

df['reward']=df.groupby('team')['Q4'].transform(lambda x: 1.2*x.mean())
# 注意不能写成下面的形式,不允许列名出现在函数体内部
# df['reward']=df.groupby('team').transform(lambda x: 1.2*x['Q4'].mean())
df.head()

在这里插入图片描述

(四)apply函数的用法

1、apply应用于分组:GroupBy.apply的使用

apply函数的功能更为强大,它也要求参数是函数。分组后应用apply函数,其实是在 split 得到的每一个 DataFrame 对象上应用指定的函数(分组是先 split 再 apply)。

示例:要求计算下半年比上半年增加的量,返回值是一个 Series。

# 做法1:
# grouped = df.groupby('team')
# delta = grouped.apply(lambda x:x['Q3'].sum()+x['Q4'].sum()-x['Q1'].sum()-x['Q2'].sum())# 做法2:使用apply一次处理一条分组后的记录(是一个Series对象)
grouped = df.loc[:,'Q1':'Q4'].groupby(df['team']).sum()   # grouped已经是一个DataFrameGroupBy对象
delta = grouped.apply(lambda x:x['Q3']+x['Q4']-x['Q1']-x['Q2'],axis=1)   # axis=1表明一次传入的是一条行记录# 做法3:使用pipe函数把lambda函数应用到整个组对象上(Apply function to the full GroupBy object instead of to each group)
# grouped = df.loc[:,'team':'Q4'].groupby('team').sum()   # grouped已经是一个DataFrameGroupBy对象
# delta = grouped.pipe(lambda x:x['Q3']+x['Q4']-x['Q1']-x['Q2'])  # grouped.reset_index().concat(delta)
# grouped.agg(lambda x:x['Q3'].sum()+x['Q4'].sum()-x['Q1'].sum()-x['Q2'].sum())# 对比:如果不用apply而使用agg,看看是什么结果
# grouped = df.groupby('team')
# delta = grouped.agg(lambda x:x['Q3'].sum()+x['Q4'].sum()-x['Q1'].sum()-x['Q2'].sum())delta.name = 'delta'   # 设置Series对象的name,之后与DataFrame拼接就可以变成列名了
pd.concat([grouped,delta],axis=1)

在这里插入图片描述

进一步理解agg:是把返回值作用到每一列上去

grouped = df.groupby('team')
grouped.agg(lambda x:print(x))
2         Ack
7        Lfie
9       Oscar
16     Joshua
17      Henry
20      Lucas
22     Arthur
34    Reggie1
40       Toby
42      Dylan
51      Hugo0
67      Caleb
70     Nathan
71      Blake
75    Stanley
79      Tyler
88      Aaron
Name: name, dtype: object
6         Acob
10         Leo
11       Logan
14      Thomas
25    Harrison
30      Edward
35      Samuel
38      Elijah
39      Harley
50      Jenson
53     Frankie
56       David
58       Lewis
60      Ronnie
64     Harvey2
77     Michael
78     Elliott
83     Albert0
84         Kai
85        Liam
92    Grayson7
93      Jamie0
Name: name, dtype: object
1          Arry
3         Eorge
5        Harlie
12       Archie
13         Theo
18      William
28       Daniel
32    Alexander
33         Adam
37    Sebastian
46        Tommy
47        Jake3
54       Ollie3
62      Matthew
73       Elliot
81        Ellis
86        Calum
87       Louis2
91       Connor
95      Gabriel
96      Austin7
97     Lincoln4
Name: name, dtype: object
4           Oah
8        Reddie
21        Ethan
23        Mason
27       Finley
44     Benjamin
48        Louie
49      Carter7
52       Bobby1
57       Albie1
59         Luca
63         Alex
65       Reuben
66      Jayden6
68      Hunter3
69    Theodore3
72        Luke6
89         Ezra
94        Aiden
Name: name, dtype: object
0        Liver
15       James
19         Max
24       Isaac
26       Teddy
29       Riley
31      Joseph
36       Jaxon
41       Arlo8
43        Jude
45       Rory9
55     Zachary
61    Jackson5
74       Roman
76      Dexter
80        Ryan
82        Finn
90        Leon
98         Eli
99         Ben
Name: name, dtype: object
2     57
7      9
9     77
16    63
17    91
20    60
22    44
34    30
40    52
42    86
51    28
67    64
70    87
71    78
75    69
79    75
88    96
Name: Q1, dtype: int64
6     61
10    17
11     9
14    80
25    89
30    57
35     9
38    97
39     2
50    66
53    18
56    21
58     4
60    53
64    43
77    89
78     9
83    85
84    66
85     2
92    59
93    39
Name: Q1, dtype: int64
1     36
3     93
5     24
12    83
13    51
18    80
28    50
32    91
33    90
37     1
46    29
47    69
54    10
62    44
73    15
81    34
86    14
87    13
91    62
95    48
96    21
97    98
Name: Q1, dtype: int64
4     65
8     64
21    79
23    80
27    62
44    15
48    24
49    57
52    50
57    79
59     5
63    14
65    70
66    64
68    38
69    43
72    15
89    16
94    20
Name: Q1, dtype: int64
0     89
15    48
19    97
24    74
26    71
29    35
31    67
36    88
41    48
43     8
45     8
55    12
61     6
74    73
76    73
80    92
82     4
90    38
98    11
99    21
Name: Q1, dtype: int64
2     60
7     10
9      9
16     4
17    15
20    41
22    53
34    12
40    27
42    87
51    25
67    34
70    77
71    23
75    71
79    16
88    75
Name: Q2, dtype: int64
6     95
10     4
11    89
14    48
25    13
30    38
35    38
38    89
39    99
50    77
53    62
56    47
58    34
60    13
64    76
77    21
78    31
83    38
84    45
85    80
92    84
93    97
Name: Q2, dtype: int64
1     37
3     96
5     13
12    89
13    86
18    68
28    50
32    76
33    32
37    14
46    44
47    23
54    76
62    33
73    17
81    34
86    91
87    94
91    38
95    59
96    31
97    93
Name: Q2, dtype: int64
4     49
8     93
21    45
23    96
27    73
44    88
48    84
49    52
52    55
57    82
59    40
63    70
65    72
66    21
68    80
69     7
72    97
89    56
94    31
Name: Q2, dtype: int64
0     21
15    77
19    75
24    23
26    91
29    26
31    87
36    98
41    34
43    45
45    12
55    71
61    10
74     1
76    94
80    70
82     1
90    60
98    74
99    43
Name: Q2, dtype: int64
2     18
7     99
9     26
16    80
17    75
20    77
22    42
34    23
40    17
42    65
51    14
67    46
70    62
71    93
75    39
79    44
88    55
Name: Q3, dtype: int64
6     94
10    33
11    35
14    56
25    18
30    86
35    88
38    15
39    12
50    88
53    52
56    99
58    77
60    34
64    87
77    59
78    33
83    41
84    13
85    24
92    74
93    84
Name: Q3, dtype: int64
1     37
3     71
5     87
12    59
13    87
18     3
28    72
32    26
33    47
37    68
46    28
47    11
54    30
62    41
73    76
81    77
86    16
87    51
91    63
95    87
96    30
97     1
Name: Q3, dtype: int64
4     61
8     57
21    89
23    26
27    84
44    52
48    54
49    77
52    60
57    56
59    91
63    55
65    76
66    10
68    82
69    68
72    95
89    86
94    62
Name: Q3, dtype: int64
0     24
15    52
19    41
24    28
26    21
29    59
31    87
36    19
41    52
43    13
45    58
55    85
61    15
74    25
76    53
80    64
82    55
90    31
98    58
99    41
Name: Q3, dtype: int64
2     84
7     37
9     67
16    30
17    17
20    62
22    40
34     9
40    68
42    20
51    71
67    88
70    13
71     9
75    97
79    63
88     8
Name: Q4, dtype: int64
6      8
10    79
11    65
14    41
25    75
30    87
35    66
38    46
39    13
50    74
53    33
56     2
58    28
60    99
64    90
77    92
78    60
83    17
84    48
85    25
92    33
93    55
Name: Q4, dtype: int64
1     57
3     78
5     43
12    68
13    27
18    26
28    61
32    79
33    39
37    48
46    76
47    40
54    36
62    98
73    22
81    42
86    82
87    22
91    46
95    74
96    43
97    20
Name: Q4, dtype: int64
4     86
8     72
21    88
23    49
27    68
44    25
48    11
49    50
52    59
57    96
59    83
63    87
65    56
66    21
68    40
69    80
72    99
89    61
94    68
Name: Q4, dtype: int64
0     64
15    11
19     3
24    65
26    48
29    83
31    93
36    98
41    51
43    65
45    27
55    93
61    33
74    44
76    20
80    31
82    32
90     7
98    91
99    74
Name: Q4, dtype: int64
2     55.270588
7     55.270588
9     55.270588
16    55.270588
17    55.270588
20    55.270588
22    55.270588
34    55.270588
40    55.270588
42    55.270588
51    55.270588
67    55.270588
70    55.270588
71    55.270588
75    55.270588
79    55.270588
88    55.270588
Name: reward, dtype: float64
6     61.963636
10    61.963636
11    61.963636
14    61.963636
25    61.963636
30    61.963636
35    61.963636
38    61.963636
39    61.963636
50    61.963636
53    61.963636
56    61.963636
58    61.963636
60    61.963636
64    61.963636
77    61.963636
78    61.963636
83    61.963636
84    61.963636
85    61.963636
92    61.963636
93    61.963636
Name: reward, dtype: float64
1     61.472727
3     61.472727
5     61.472727
12    61.472727
13    61.472727
18    61.472727
28    61.472727
32    61.472727
33    61.472727
37    61.472727
46    61.472727
47    61.472727
54    61.472727
62    61.472727
73    61.472727
81    61.472727
86    61.472727
87    61.472727
91    61.472727
95    61.472727
96    61.472727
97    61.472727
Name: reward, dtype: float64
4     75.726316
8     75.726316
21    75.726316
23    75.726316
27    75.726316
44    75.726316
48    75.726316
49    75.726316
52    75.726316
57    75.726316
59    75.726316
63    75.726316
65    75.726316
66    75.726316
68    75.726316
69    75.726316
72    75.726316
89    75.726316
94    75.726316
Name: reward, dtype: float64
0     61.98
15    61.98
19    61.98
24    61.98
26    61.98
29    61.98
31    61.98
36    61.98
41    61.98
43    61.98
45    61.98
55    61.98
61    61.98
74    61.98
76    61.98
80    61.98
82    61.98
90    61.98
98    61.98
99    61.98
Name: reward, dtype: float64

在这里插入图片描述

apply的一个经典应用,在调用函数的同时还可以给它传递参数(agg也可以通过args给函数传参数)

示例:求每一组特定列的前几名

排序操作不是聚合,聚合是返回1个标量,排序会返回多个值,因此只能用apply而不能用agg

def top(df,n=5,column=None):if not column:column=df.columns[0]return df.sort_values(by=column)[-n:]    
# top(df,n=6,column='Q1')
df.groupby('team').apply(top,n=5,column='Q1')

在这里插入图片描述

2、apply不应用于分组:DataFrame.apply的使用

apply应用于 DataFrame 时,默认是axis=0,即每次会把 DataFrame 的一列作为一个 Series 对象传递给函数。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html?highlight=apply#pandas.DataFrame.apply

def top2(col,n=5):return col.sort_values()[-n:]
df.loc[:,'Q1':'Q4'].apply(top2,n=5)

在这里插入图片描述

apply应用于 DataFrame 时,当axis=1时,每次会把 DataFrame 的一行作为一个 Series 对象传递给函数。

df.loc[:,'Q1':'Q4'].apply(top2,n=2,axis=1).head()

在这里插入图片描述

3、map函数的使用

map函数只能应用到 Series 对象上,对 Series 对象中的每个元素值进行变换。

change_teams = {'A':'1组','B':'2组','C':'3组','D':'4组','E':'5组'}
df['team'].map(change_teams).head(10)
0    5组
1    3组
2    1组
3    3组
4    4组
5    3组
6    2组
7    1组
8    4组
9    1组
Name: team, dtype: object

4、applymap函数的使用

applymap函数应用到 DataFrame 对象上,对 DataFrame 对象中的每个元素值进行相同的变换。

df.loc[:,'Q1':'Q4'].applymap(lambda x: str(x)+'$').head()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/791175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯练习】tarjan算法求解LCA

还是一道比较明显的求LCA(最近公共祖先)模型的题目,我们可以使用多种方法来解决该问题&#xff0c;这里我们使用更好写的离线的tarjan算法来解决该问题。 除去tarjan算法必用的基础数组&#xff0c;我们还有一个数组d[],d[i]记录的是每个点的出度&#xff0c;也就是它的延迟时间…

高级IO/多路转接-select/poll(1)

概念背景 IO的本质就是输入输出 刚开始学网络的时候&#xff0c;我们简单的写过一些网络服务&#xff0c;其中用到了read&#xff0c;write这样的接口&#xff0c;当时我们用的就是基础IO&#xff0c;高级IO主要就是效率问题。 我们在应用层调用read&&write的时候&…

YOLOv2

YOLOv2 论文介绍论文改进1. Batch Normalization2. High Resolution Classifier3. Convolutional With Anchor Boxes4. vgg16换成darknet-195. Dimension Clusters&#xff08;w h的聚类&#xff09;6 预测坐标7. passthrough8. 多尺度输入训练 损失函数 论文介绍 论文名字&am…

Educational Codeforces Round 133 (Rated for Div. 2) C. Robot in a Hallway

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5; c…

多模态系列-综述Video Understanding with Large Language Models: A Survey

本文是LLM系列文章,针对《Video Understanding with Large Language Models: A Survey》的翻译。 论文链接:https://arxiv.org/pdf/2312.17432v2.pdf 代码链接:https://github.com/yunlong10/Awesome-LLMs-for-Video-Understanding 大型语言模型下的视频理解研究综述 摘要…

人工智能大模型+智能算力,企商在线以新质生产力赋能数字化转型

2024 年3月28 日&#xff0c;由中国互联网协会主办、中国信通院泰尔终端实验室特别支持的 2024 高质量数字化转型创新发展大会暨铸基计划年度会议在京召开。作为新质生产力代表性企业、数算融合领导企业&#xff0c;企商在线受邀出席大会主论坛圆桌对话&#xff0c;与行业专家共…

Lora人机界面开发 3

1 显示原理 液晶的形成&#xff1a;像水一样液晶介于固态和液态之间 偏光原理&#xff1a;两块偏光的栅栏角度相互垂直时光线就完全无法通过 内部结构&#xff1a;利用电场控制液晶分支的旋转 颜色深度 TFT开关的工作原理&#xff1a; 扫描线连接同一列所有TFT栅极电极&…

通过mapreduce程序统计旅游订单(wordcount升级版)

通过mapreduce程序统计旅游订单&#xff08;wordcount升级版&#xff09; 本文将结合一个实际的MapReduce程序案例&#xff0c;探讨如何通过分析旅游产品的预订数据来揭示消费者的偏好。 程序概览 首先&#xff0c;让我们来看一下这个MapReduce程序的核心代码。这个程序的目…

创新视角:探索系统产品可用性测试的前沿分类方法与实践应用

一、可用性测试概念 1、什么是可用性&#xff1f; 任何与人可以发生交互的产品都应该是可用的&#xff0c;就一般产品而言&#xff0c;可用性被定义为目标用户可以轻松使用产品来实现特定目标。 ISO9241/11中的定义是&#xff1a; 一个产品可以被特定的用户在特定的场景中&a…

跨越时空,启迪智慧:奇趣相机重塑儿童摄影与教育体验

【科技观察】近期&#xff0c;奇趣未来公司以其创新之作——“奇趣相机”微信小程序&#xff0c;强势进军儿童AI摄影市场。这款专为亚洲儿童量身定制的应用&#xff0c;凭借精准贴合亚洲儿童面部特征的AIGC大模型&#xff0c;以及丰富的摄影模板与场景设定&#xff0c;正在重新…

Ps:匹配颜色

匹配颜色 Match Color命令可以将一个图像的颜色与另一个图像的颜色相匹配。 Ps菜单&#xff1a;图像/调整/匹配颜色 Adjustments/Match Color 匹配颜色命令可匹配多个图像之间、多个图层之间或者多个选区之间的颜色&#xff0c;还可以通过更改亮度和色彩范围以及中和色痕来调整…

Day17-【Java SE进阶】特殊文本文件、日志技术

一、特殊文本文件 为什么要用这些特殊文件&#xff1f; 存储多个用户的&#xff1a;用户名、密码 存储有关系的数据&#xff0c;做为系统的配置文件做为信息进行传输 日志技术 把程序运行的信息&#xff0c;记录到文件中&#xff0c;方便程序员定位bug、并了解程序的执行情…

Java并发编程基础面试题详细总结

1. 什么是线程和进程? 1.1 何为进程? 进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;因此进程是动态的。系统运行一个程序即是一个进程从创建&#xff0c;运行到消亡的过程。 在 Java 中&#xff0c;当我们启动 main 函数时其实就是启动了一个…

Windows进程监视器Process Monitor

文章目录 Process Monitor操作逻辑 Process Monitor Process Monitor是 Windows 的高级监视工具&#xff0c;是Filemon Regmon的整合增强版本&#xff0c;实时显示文件系统&#xff0c;注册表&#xff0c;网络活动&#xff0c;进程或线程活动&#xff0c;资料收集事件&#x…

阿里云弹性计算通用算力型u1实例性能评测,性价比高

阿里云服务器u1是通用算力型云服务器&#xff0c;CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器&#xff0c;ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xf…

记录一次threejs内存泄露问题排查过程

问题描述&#xff1a; 一个有关地图编辑的使用threejs的这样的组件&#xff0c;在多次挂载销毁后&#xff0c;页面开始卡顿。 问题排查&#xff1a; 1. 首先在chrome dev tool中打开performance monitor面板&#xff0c;观察 JS head size、DOME Nodes、Js event listeners数…

【C++】C++11类的新功能

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 默认成员函数 类成…

Java基于微信小程序高校体育场管理小程序

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

跨域问题解决方案之CORS

跨域问题解决方案之CORS 文章目录 跨域问题解决方案之CORS概述浏览器的同源策略同源的判定规则目的同源策略的限制范围 浏览器的同源策略为什么会引发跨域问题&#xff1f;CORS规则CORS解决方案CORS方案将请求分为两类举例简单请求预检请求总结学以致用 概述 浏览器安全的基石…

esp32控制舵机---待完善

舵机有三个引脚&#xff0c;分别是电源、电源GND和信号线。如下图所示&#xff1a; ESP32-WROOM-32E的引脚的定义如下&#xff1a; 图来自乐鑫官网:ESP32-DevKitC V4 入门指南 - ESP32 - — ESP-IDF 编程指南 v5.2.1 文档 硬件连接图&#xff1a; 待补充