数据科学必备Pandas数据分组GroupBy方法汇总

大家好,我是Mr数据杨。今天我们将一同走进充满数字的Python世界,我想拿《三国演义》的例子来阐述一下学习笔记中的主题。

首先得有数据。试想一下,如果三国的谋士们如诸葛亮,郭嘉,周瑜,手中没有了兵力、粮草、城池的数据,他们又怎能谋划出赢得战争的策略呢?这就如同在学习Python的过程中需要用到的三国志人物数据,空气质量数据集,新闻聚合器数据集。数据是分析的基石,就像每一场战争的胜败都基于谋士手中的资料。

然后,将这些数据如何有效地整理和使用就像《三国演义》中的谋士们一样,他们如何利用手中的信息,才是关键。比如说,Python里的GroupBy的工作原理。GroupBy就像诸葛亮把不同战区的信息整理归类,把相同的数据放在一起,这样便于分析和利用。或许周瑜就是这样利用GroupBy原理,将敌人的兵力分布、粮草储备等信息整理出来,然后决定是否施行火攻。

最后来聊聊提高GroupBy的性能。性能,对于Python来说是至关重要的,这就如同战场上,郭嘉总能运筹帷幄之中,决胜千里之外,这就是他提高了策略的效率,GroupBy的性能也是如此,优化它,能更快更准确地帮助拿到想要的结果。

当然,这只是个开头,接下来我们还会一起深入探讨Pandas GroupBy方法的汇总,就像三国演义的战役一样,每一场都充满惊奇和学问。

文章目录

数据准备

  1. 三国志13的人物数据。
  2. 空气质量数据集 包含定期气体传感器读数。
  3. 新闻数据集 其中包含数十万条新闻文章的元数据。

示例1:三国志人物数据

我们以剖析《三国志》人物数据为例,来介绍GroupBy操作的具体用法。

首先,我们需要导入pandas库,并读取人物数据的Excel文件。

import pandas as pd

df = pd.read_excel("Romance of the Three Kingdoms 13/人物详情数据.xlsx")
df.head()

下面是导入数据并显示前几行的示例结果:

数据科学必备Pandas数据分组GroupBy方法汇总

问题1(单列聚合): 如果想了解所有人物中的分类情况,即文臣和武将的数量分别是多少,应该如何操作?

我们可以使用SQL语句和Pandas操作来实现。

SQL操作:

SELECT 分類, count(名前) as 数量
FROM df
GROUP BY 分類
ORDER BY 分類;

Pandas操作:

n_by_state = df.groupby("分類")["名前"].count().nlargest(2)
n_by_state

执行以上操作后,可以得到文官和武官的数量分别为336和520。

问题2(多列聚合): 如何按照性别和分类进行人物的区分?

我们可以使用SQL语句和Pandas操作来实现。

SQL操作:

SELECT 分類, 性別, count(名前) as 数量
FROM df
GROUP BY 分類, 性別
ORDER BY 分類, 性別;

Pandas操作:

n_by_state = df.groupby(["分類", "性別"])["名前"].count()
n_by_state

执行以上操作后,可以得到按照性别和分类进行区分的结果。

示例2:空气质量数据集

接下来,我们以空气质量数据集为例,介绍GroupBy操作的更多用法。

import pandas as pd

df = pd.read_excel("数据科学必备Pandas实用操作GroupBy数据分组详解/AirQualityUCI.xlsx", parse_dates=[["Date", "Time"]])
df.rename(columns={
    "CO(GT)": "co",
    "Date_Time": "tstamp",
    "T": "temp_c",
    "RH": "rel_hum",
    "AH": "abs_hum",
}, inplace=True)

df.set_index("tstamp", inplace=True)

下面是导入数据并对其进行处理后的示例结果:

数据科学必备Pandas数据分组GroupBy方法汇总

在这个数据集中, co 是每小时的平均一氧化碳读数, temp_crel_humabs_hum 分别是每小时的平均温度、相对湿度和绝对湿度。观察时间跨度从 2004 年 3 月持续到 2005 年 4 月。

派生数组进行分组

我们可以利用星期的数据(转化后的字符串)进行分组聚合。

day_names = df.index.day_name()
day_names[:10]

执行以上操作后,可以得到每天的星期名称。

问题1: 如何计算一周中某天的平均一氧化碳 (co) 的数据?

df.groupby(day_names)["co"].mean()

执行以上操作后,可以得到一周中每天的平均一氧化碳 (co) 数据。

问题2: 如何按照星期和每个时间段对数据进行聚合?

hr = df.index.hour
df.groupby([day_names, hr])["co"].mean().rename_axis(["dow", "hr"])

执行以上操作后,可以按照星期和每个时间段对数据进行聚合。

问题3: 如何根据温度划分离散区间对数据进行分组聚合?

bins = pd.cut(df["temp_c"], bins=3, labels=("cool", "warm", "hot"))
df[["rel_hum", "abs_hum"]].groupby(bins).agg(["mean", "median"])

执行以上操作后,可以根据温度划分离散区间对数据进行分组聚合。

问题4: 如何按年度和季度对数据进行聚合?

df.groupby([df.index.year, df.index.quarter])["co"].agg(["max", "min"]).rename_axis(["year", "quarter"])

执行以上操作后,可以按照年度和季度对数据进行聚合。

示例3:新闻聚合器数据集

最后,我们以新闻

聚合器数据集为例,介绍GroupBy操作的更多用法。

import datetime as dt
import pandas as pd

def parse_millisecond_timestamp(ts):
    return dt.datetime.fromtimestamp(ts / 1000, tz=dt.timezone.utc)

df = pd.read_csv(
    "数据科学必备Pandas实用操作GroupBy数据分组详解/newsCorpora.csv",
    sep="\t",
    header=None,
    index_col=0,
    names=["title", "url", "outlet", "category", "cluster", "host", "tstamp"],
    parse_dates=["tstamp"],
    date_parser=parse_millisecond_timestamp,
    dtype={
        "outlet": "category",
        "category": "category",
        "cluster": "category",
        "host": "category",
    },
)
df.head()

下面是导入数据并显示前几行的示例结果:

数据科学必备Pandas数据分组GroupBy方法汇总

在这个数据集中, category 列包含了新闻的分类,分别是 b 商业、t 科技、e 娱乐和 m 健康。

问题1: 如何计算包含某关键字的数据在不同出版机构中的出现次数,并按次数排序?

df.groupby("outlet", sort=False)["title"].apply(
    lambda ser: ser.str.contains("Fed").sum()
).nlargest(10)

执行以上操作后,可以得到包含某关键字的数据在不同出版机构中的出现次数,并按次数排序。

GroupBy 的工作原理

实际上, .groupby() 操作是由三个步骤组成的:拆分、应用和合并。

拆分过程

我们可以通过对GroupBy对象进行迭代来查看拆分的结果。

by_state = df.groupby("分類")

for state, frame in by_state:
    print(f"前2条数据 {state!r}")
    print("------------------------")
    print(frame.head(2), end="\n\n")

执行以上操作后,会显示每个组的前两条数据。

应用过程

将相同的操作(或可调用对象)应用于拆分阶段生成的每个小组。

state, frame = next(iter(by_state))
state
'文官'

frame.head(5)

执行以上操作后,可以查看应用操作后的结果。

合并过程


python
frame["名前"].count()
336

以上操作展示了合并阶段的结果。

提高GroupBy的性能

使用适当的方法可以提高GroupBy操作的性能。

Version 1: 使用 .apply()

df.groupby("outlet", sort=False)["title"].apply(
    lambda ser: ser.str.contains("Fed").sum()
).nlargest(10)

Version 2: 使用矢量化操作

mentions_fed = df["title"].str.contains("Fed")
mentions_fed.groupby(
    df["outlet"], sort=False
).sum().nlargest(10).astype(np.uintc)

以上是使用两种不同方法进行操作的示例,可以看到使用矢量化操作的性能更好。

Pandas GroupBy 方法汇总

Pandas提供了许多GroupBy方法,下面是一些常用的方法:

  • 聚合方法(也称为归约方法):.agg()、.aggregate()、.all()、.any()、.apply()、.corr()、.corrwith()、.count()、.cov()、.cumcount()、.cummax()、.cummin()、.cumprod()、.cumsum()、.describe()、.idxmax()、.idxmin()、.mad()、.max()、.mean()、.median()、.min()、.nunique()、.prod()、.sem()、.size()、.skew()、.std()、.sum()、.var()。
  • 过滤器方法:.filter()、.first()、.head()、.last()、.nth()、.tail()、.

take()。

  • 转换方法:.bfill()、.diff()、.ffill()、.fillna()、.pct_change()、.quantile()、.rank()、.shift()、.transform()、.tshift()。
  • 元方法:. iter()、.get_group()、.groups、.indices、.ndim、.ngroup()、.ngroups、.dtypes。
  • 绘图方法:.hist()、.ohlc()、.boxplot()、.plot()。

以上是对GroupBy操作的示例和方法汇总,希望能帮助你更好地理解和应用Python编程中的GroupBy功能。

Original: https://blog.csdn.net/qq_20288327/article/details/124884920
Author: Mr数据杨
Title: 数据科学必备Pandas数据分组GroupBy方法汇总

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/600299/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球