计算机系统应用教程网站

网站首页 > 技术文章 正文

「程序员」如何5分钟掌握,pandas数据累计与分组?

btikc 2024-10-11 11:21:35 技术文章 3 ℃ 0 评论

累计与分组

在分析较大的数据时,一项基本的工作就是,有效的数据累计、计算累计。列如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进行数据分析》私信「书籍」就可以得到。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表