Python groupby グループ化してから平均して合計する集計集計変換では、アプリケーション関数の形状は変わりません


一、 groupby 依据某列分组; groupby 依据多列分组;
二、应用 mean sum count std median size max min等函数聚合数据;
三、transform 不改变数据形状(相当于计算后替换原来的每一个元素)


1. グループ化


ここに画像の説明を挿入

ここに画像の説明を挿入

グループ化機能は主にpandasのgroupby機能を利用します。グループ化機能は他の機能でも完結できますが、比較的便利なのはgroupby機能です。この機能は魔法的な機能が多く、熟練すると非常に強力です。groupby 関数の公式パラメータは次のとおりです。

ここに画像の説明を挿入

import pandas as pd
import glob
# 获取该目录下的所有文件
files = glob.glob('../../data/03表格数据处理Pandas/C3.7 数据的分组与聚合/*')
# 利用 concat 将所有数据拼接成一个大的 df
df = pd.concat([pd.read_csv(f) for f in files])
# 删除列(值全为空);删除行(存在任意空值)
df = df.dropna(axis='columns', how='all').dropna(axis='index', how='any')
# 对 date 这一列进行格式转换
df['date'] = df.apply({
    
    'date': lambda x: pd.to_datetime(x, format='%Y%m%d')})
# 获取到 月 和 天
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
# 删除 date 列
df = df.drop(columns='date')

# 简单分组
# 分组后的数据想要查看,必须循环打印
group = df.groupby('type')
for i in group:
    print(i)

# 获取某列元素等于特定值的数据
df[df['type']=='AQI']

# 多重分组
# 分组后的数据想要查看,必须循环打印
group = df.groupby(['type', 'month'])
for i in group:
    print(i)

# 获取同时满足多个列条件的数据
df[(df['type']=='AQI') & (df['month']==1)]

ここに画像の説明を挿入

2. 重合

いわゆる集計とは、データを合理的にグループ化した後、必要に応じて合計や変換などの一連の操作をデータに対して実行することです。通常、集計関数はデータ処理の最終目標であり、より適切な集計のためにデータのグループ化がよく使用されます。

ここに画像の説明を挿入

1. 組み込み関数を使用した集計
# 对type列所有值等于AQI的数据进,行多重分组
group = df[df['type']=='AQI'].groupby(['hour', 'month'])
# 使用内置的方法,进行求平均值聚合,得到每个月每小事的平均值
group.mean()

ここに画像の説明を挿入


2. 単純な集計には agg を使用します

# 对所有列数据应用相同函数的两个函数
group.agg([np.mean, np.std])

# 传入字典格式的数据
# 对不同列数据应用不同函数
group.agg({
    
    '东四': [np.mean, np.std], '天坛': [np.min, np.max]})




三、変換機能

関数transformを使用して、groupbyオブジェクト、transformの計算結果、および元のデータを変換します形状保持一致

組み込みの集計関数または agg を使用するとデータの形状が変わります。上図のデータの行数と列数を比較してください。ただし、transform を使用してもデータの形状は変わりません相当于用算出来的值,替换原数据中的每一个值

import pandas as pd
import glob
import numpy as np

files = glob.glob('../../data/03表格数据处理Pandas/C3.7 数据的分组与聚合/*')
df = pd.concat([pd.read_csv(f) for f in files])
df = df.dropna(axis='columns', how='all').dropna(axis='index', how='any')
df['date'] = df.apply({
    
    'date': lambda x: pd.to_datetime(x, format='%Y%m%d')})
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
df = df.drop(columns='date')
aqi = df[df['type']=='AQI']
# 改变数据形状
aqi.groupby(['month']).agg(np.mean)

# 不改变数据形状 应用内置函数
aqi.groupby(['month']).transform(np.mean)
# 不改变数据形状 应用匿名函数
aqi.groupby(['hour', 'month']).transform(lambda x: x - x.mean())

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_35240689/article/details/127073148