数据分析-Pandas的核心操作groupby简介
数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律?
数据表,时间序列数据在数据分析建模中很常见,例如天气预报,空气状态监测,股票交易等金融场景。数据分析过程中重新调整,重塑数据表是很重要的技巧,此处选择Titanic数据,以及巴黎、伦敦欧洲城市空气质量监测 N O 2 NO_2 NO2数据作为样例。
数据分析
实验数据分析处理,股票序列,时间序列,信号序列,有时候表格的数据需要进行分类,拆分,分组处理,,针对每组进行分类处理,处理后的结果还想汇总起来。这是pandas很常见的使用场景,pandas如何通过groupby,分步骤进行数据分类、处理、汇总呢?
Group by的意义:split-apply-combine
通过"group by",是包含以下一项或多项的步骤:
- 拆分:根据某些条件将数据拆分为几组。
- 应用:对每个组进行独立的函数操作。
- 合并:将结果合并到一定数据结构中。
其中,拆分步骤的操作就是字面的意思,最直接直白的。
而在应用步骤中,可能希望执行下列操作之一:
-
聚合:为每个分组计算汇总统计量,统计数据。例如:
- 计算组总和或均值。
- 计算组大小/计数。
-
转换:执行一些特定组的计算,并返回一个 like-indexed 对象。例如:
- 标准化操作分组的数据 (zscore)。
- 填充NA值,使用每个组派生计算的值填充组内的 NA。
-
过滤:筛掉一些分组,根据组为单位计算,筛选条件计算结果为 True 或 False。例如:
- 丢弃占比低,少数成员的组数据。
- 根据总和或平均值来筛选分组。
其中许多操作是在 GroupBy 对象上定义的,例如聚合 API、窗口 API 和重采样 API。
也有有这样可能情况,例如给定的操作并没有落入到任何一个分类数据中,或者只是一些分组合并。
在这些情形下,最合适的可能就是使用GroupBy计算。这样的计算会检查应用计算步骤后的结果,并且尽量把这些分组结果合并为一个最后结果,当如果这些并不适合上述的类型数据。
使用内置 GroupBy ,把一个操作拆分为多个步骤,比用户定义的 Python 函数更有效。
当然,GroupBy 这个名字,对于使用过的SQL语言人来说,应该很熟悉,您会常常编写如下代码:
SELECT Column1, Column2, mean(Column3), sum(Column4)
FROM SomeTable
GROUP BY Column1, Column2
我们的目标是通过pandas,让这些操作更加自然,容易表达。后续我们将讨论各个方面的 GroupBy 的功能,同时提供一些样例。
Splitting拆分
分组的抽象定义是提供映射规则把数据映射到分组,标签。创建 GroupBy 对象,您可以执行以下操作:
python
In [1]: speeds = pd.DataFrame(
...: [
...: ("bird", "Falconiformes", 389.0),
...: ("bird", "Psittaciformes", 24.0),
...: ("mammal", "Carnivora", 80.2),
...: ("mammal", "Primates", np.nan),
...: ("mammal", "Carnivora", 58),
...: ],
...: index=["falcon", "parrot", "lion", "monkey", "leopard"],
...: columns=("class", "order", "max_speed"),
...: )
...:
In [2]: speeds
Out[2]:
class order max_speed
falcon bird Falconiformes 389.0
parrot bird Psittaciformes 24.0
lion mammal Carnivora 80.2
monkey mammal Primates NaN
leopard mammal Carnivora 58.0
In [3]: grouped = speeds.groupby("class")
In [4]: grouped = speeds.groupby(["class", "order"])
可以通过多种不同的方式指定映射:
- Python 函数,被每个索引标签调用 。
- 列表或 NumPy 数组,与索引长度相同。
- 字典 或 序列,提供
label -> group name
映射。 - 对于
DataFrame
对象,字符串标定的列名或 用于索引级别分组。 - 列表包含上述任何一项。
总之,将分组对象统称为键。例如, 考虑以下几点:
python
In [5]: df = pd.DataFrame(
...: {
...: "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"],
...: "B": ["one", "one", "two", "three", "two", "two", "one", "three"],
...: "C": np.random.randn(8),
...: "D": np.random.randn(8),
...: }
...: )
...:
In [6]: df
Out[6]:
A B C D
0 foo one 0.469112 -0.861849
1 bar one -0.282863 -2.104569
2 foo two -1.509059 -0.494929
3 bar three -1.135632 1.071804
4 foo two 1.212112 0.721555
5 bar two -0.173215 -0.706771
6 foo one 0.119209 -1.039575
7 foo three -1.044236 0.271860
DataFrame 的groupby
在 DataFrame 上,可以通过调用 groupby方法返回,来获取 GroupBy 对象。 可以按A 或B 列,或两者结合进行分组:
python
In [7]: grouped = df.groupby("A")
In [8]: grouped = df.groupby("B")
In [9]: grouped = df.groupby(["A", "B"])
实际上,df.groupby('A') 和 df.groupby(df['A']) 效果是一致的。
如果我们在列 A 和 B上设置多标签 MultiIndex,可以按所有列, 除了指定的列以外:
python
In [10]: df2 = df.set_index(["A", "B"])
In [11]: grouped = df2.groupby(level=df2.index.names.difference(["B"]))
In [12]: grouped.sum()
Out[12]:
C D
A
bar -1.591710 -1.739537
foo -0.752861 -1.402938
上面的 GroupBy 将拆分其索引(行)上的 DataFrame。要按列拆分,首先要执行 转置:
python
In [13]: def get_letter_type(letter):
....: if letter.lower() in 'aeiou':
....: return 'vowel'
....: else:
....: return 'consonant'
....:
In [14]: grouped = df.T.groupby(get_letter_type)
Pandas 的index 对象支持重复值。如果 非唯一索引用作 GroupBy 操作中的组键,所有值 对于相同的索引值将被视为在一组中,因此 聚合函数的输出将仅包含唯一的索引值,例如:
python
In [15]: index = [1, 2, 3, 1, 2, 3]
In [16]: s = pd.Series([1, 2, 3, 10, 20, 30], index=index)
In [17]: s
Out[17]:
1 1
2 2
3 3
1 10
2 20
3 30
dtype: int64
In [18]: grouped = s.groupby(level=0)
In [19]: grouped.first()
Out[19]:
1 1
2 2
3 3
dtype: int64
In [20]: grouped.last()
Out[20]:
1 10
2 20
3 30
dtype: int64
In [21]: grouped.sum()
Out[21]:
1 11
2 22
3 33
dtype: int64
请注意,只有需要才会进行拆分。创建 GroupBy 对象 仅验证您是否已通过有效的映射。
以上代码只是一个简单示例,示例代码中的表达式可以根据实际问题进行修改。
后续介绍下其他的操作。
觉得有用 收藏 收藏 收藏
点个赞 点个赞 点个赞
End
GPT专栏文章:
GPT实战系列-ChatGLM3本地部署CUDA11+1080Ti+显卡24G实战方案
GPT实战系列-LangChain + ChatGLM3构建天气查询助手
GPT实战系列-大模型为我所用之借用ChatGLM3构建查询助手
GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(二)
GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(一)
GPT实战系列-ChatGLM2部署Ubuntu+Cuda11+显存24G实战方案