网站首页 > 技术文章 正文
累计与分组
在分析较大的数据时,一项基本的工作就是,有效的数据累计、计算累计。列如sum()、mean()、median()、min()和max(),其中每一项指标都呈现出大数据集的特征。
一、简单的累计计算
简单的累计计算是对DataFrame或者Series对象,使用累计函数:sum()、mean()、median()、min()、max()等函数。pandas为Dataframe提供了describe()方法,可以一次性计算出,每一列上的若干常用统计值。
- Series 的累计函数
rng= np.random.RandomState(42) ser= pd.Series(rng.rand(5)) ser
代码结果:
0 0.374540 1 0.950714 2 0.731994 3 0.598658 4 0.156019 dtype: float64 # 求和 ser.sum() 2.811925491708157
- DataFrame的累计函数
默认对每列进行统计,设置 axis 参数,可以对每一行进行统计。
df= pd.DataFrame({'A': rng.rand(5), 'B': rng.rand(5)}) df
?代码结果:
# 求平均值 df.mean() A 0.477888 B 0.443420 dtype: float64
- describe() 方法:
计算每一列的若干常用统计值。
planets.dropna().describe()
?代码结果:
二、高阶的累计方法
GroupByGroupBy简单来看,就是Pandas为DataFrame提供的一个分组的工具。通过df.groupby('key'),可以得到一个DataFrameGroupBy对象。你可以将它看作是一种特殊形式的DataFrame,里面隐藏着若干组数据,但是在没有应用聚合操作之前不会计算。这种“延迟计算”的方法,使得大多数常见的累计计算操作,可以通过一种对用户而言几乎透明的方式,非常高效的实现。
GroupBy的过程如下: 分割:将DataFrame按照指定的键分割成若干组 应用:对每个组应用聚合函数,通常是累计、转换或过滤函数 组合:将每个组的结果合并成一个输出数组
- DataFrameGroupBy对象的操作
对指定列的数据,使用简单累计函数。
#对数据集在method列上进行分组,然后求各组中行星轨道周期的中位数 planets.groupby('method')['orbital_period'].median()
代码结果:
method Astrometry 631.180000 Eclipse Timing Variations 4343.500000 Imaging 27500.000000 Microlensing 3300.000000 Orbital Brightness Modulation 0.342887 Pulsar Timing 66.541900 Pulsation Timing Variations 1170.000000 Radial Velocity 360.200000 Transit 5.714932 Transit Timing Variations 57.011000 Name: orbital_period, dtype: float64
- 按组迭代
for(method, group) inplanets.groupby('method'): print("{0:50s} shape={1}".format(method, group.shape))
代码结果:
Astrometry shape=(2, 6) Eclipse Timing Variations shape=(9, 6) Imaging shape=(38, 6) Microlensing shape=(23, 6) Orbital Brightness Modulation shape=(3, 6) Pulsar Timing shape=(5, 6) Pulsation Timing Variations shape=(1, 6) Radial Velocity shape=(553, 6) Transit shape=(397, 6) Transit Timing Variations shape=(4, 6)
- 调用方法
借助 Python 类的魔力(@classmethod),可以让任何不由 GroupBy 对象,直接应用到每一组,你可以用DataFrame的describe() 方法进行累计,对每一组数据进行描述性统计。
planets.groupby('method')['year'].describe()
?代码结果:
GroupBy对象的高级方法
- 累计(aggregate)
GroupBy对象的aggregate() 支持更复杂的操作,比如字符串、函数或者函数列表,并且能一次性计算所有累计值。
rng= np.random.RandomState(0) df= pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'], 'data1': range(6), 'data2': rng.randint(0, 10, 6)}, columns= ['key', 'data1', 'data2']) df
?代码结果:
df.groupby('key').aggregate(['min', np.median, max])
代码结果:?
另一种用法,通过 Python 字典,指定不同列需要累计的函数。
df.groupby('key').aggregate({'data1': 'min', 'data2': 'max'})
?代码结果:
- 过滤
过滤操作,可以让你按照分组的属性丢弃若干数据,只需要保留标准差超过某个阈值的组。
#定义过滤函数 deffilter_func(x): returnx['data2'].std() >4 #通过过滤函数,把标准差不大于4的过滤掉 df.groupby('key').filter(filter_func)
?代码结果:
- 转换
累计操作返回的是,对组内全量数据缩减过的结果。而转换操作返回一个新的全量数据。将每一组的样本数据减去各组的均值,实现数据标准化。
df.groupby('key').transform(lambdax: x-x.mean())
代码结果:?
- apply() 方法
apply()方法,可以在每个组上应用任意方法。这个函数输入一个DataFrame,就返回一个Pandas对象(DataFrame 或 Series)或一个标量(scalar,单个数值)。组合操作会适应,返回结果类型。
defnorm_by_data2(x): # x是一个分组数据的DataFrame x['data1'] /= x['data2'].sum() returnx print(df) df.groupby('key').apply(norm_by_data2)
代码结果:
key data1 data2 0 A 0 5 1 B 1 0 2 C 2 3 3 A 3 3 4 B 4 7 5 C 5 9
?
- 设置分割的键
分组的键除了DataFrame的列之外,还有需要其他的方法。
将列表、数组、Series或索引作为分组键。
#将列表作为分组键,下面列表中,所有0、1、2对应的索引所在行将被分到一组 L= [0, 1, 0, 1, 2, 0] print(df) df.groupby(L).sum()
代码结果:
key data1 data2 0 A 0 5 1 B 1 0 2 C 2 3 3 A 3 3 4 B 4 7 5 C 5 9
?
- 用字典或 Series 将索引映射到分组名称
df2= df.set_index('key') print(df2) mapping= {'A': 'vowel', 'B': 'consonant', 'C': 'consonant'} df2.groupby(mapping).sum()
代码结果:
data1 data2 key A 0 5 B 1 0 C 2 3 A 3 3 B 4 7 C 5 9
?
- 任意 Python 函数
与前面的字典映射类似,你可以将任意 Python 函数传入 groupby, 函数映射到索引,然后得到新的分。
print(df2) df2.groupby(str.lower).mean()
代码结果:
data1 data2 key A 0 5 B 1 0 C 2 3 A 3 3 B 4 7 C 5 9
?
- 多个有效键构成的列表
任意有效的键,都可以组合进行分组,从而返回一个多级索引的分组结果。
print(df2) df2.groupby([str.lower, mapping]).mean()
代码结果:
data1 data2 key A 0 5 B 1 0 C 2 3 A 3 3 B 4 7 C 5 9
?
关注领资料:
1.如果觉得还可以,记得点击右上角的关注,随手点个转发让更多人看到哦。
2.如果你对Python感兴趣,我为你准备了一些Python教程,私信「python」领取。
3.如果对数据分析感兴趣我这里有一本《利用python进行数据分析》私信「书籍」就可以得到。
猜你喜欢
- 2024-10-11 sklearn分类模型汇总 sklearn svm分类
- 2024-10-11 一款小众但实用的自动化特征选择工具:AutoFeatSelect
- 2024-10-11 基于决策树算法完成鸢尾花的分类并使用scikit-learn进行交叉验证
- 2024-10-11 Python 机器学习 特征降维 python tsne降维
- 2024-10-11 mooc机器学习第七天-分类支持向量机svm.svc
- 2024-10-11 模型选择之交叉验证(简单交叉验证、S折交叉验证和留一交叉验证)
- 2024-10-11 I2C七宗罪之第二罪 七宗罪二哥
- 2024-10-11 PCA 主成分分析 PCA主成分分析实现鸢尾花数据集分类-MATLAB代码
- 2024-10-11 Python实现机器学习算法——随机森林
- 2024-10-11 使用Python理解基本的机器学习-感知器和人工神经元
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)