pandas中的groupby

对GroupBy变量之后直接使用聚合函数,但这种情况下只能支持一种聚合计算。但使用agg()方法就可以对不同的列使用不同的聚合计算,而且还可以自定义聚合函数。

import pandas as pd

# 创建示例数据
data = {
    'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
    'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)

# 按公司分组并同时计算总和和平均值
grouped = df.groupby('Company')
summary = grouped['Sales'].agg(['sum', 'mean'])
print(summary)

对不同的列使用不同的聚合计算

df=pd.DataFrame({
    'Data1':np.random.randint(0,10,5),
    'Data2':np.random.randint(10,20,5),
    'key1':list("aabba"),
    'key2':list('xyyxy')
})
 
def collect_data(x):
    return x.tolist()
res1=df.groupby('key1').agg({'Data1':['min','max'],
                             'Data2':'sum',
                             'key2':['count',collect_data]})

自定义聚合函数

import pandas as pd

# 创建示例数据
data = {
    'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
    'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)

# 定义一个计算范围的函数
def range_func(series):
    return series.max() - series.min()

# 按公司分组并应用自定义函数
grouped = df.groupby('Company')
range_of_sales = grouped['Sales'].agg(range_func)
print(range_of)

过滤分组数据

import pandas as pd

# 创建示例数据
data = {
    'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
    'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)

# 定义过滤条件,选择平均销售额大于 250 的公司
def filter_func(x):
    return x['Sales'].mean() > 250

filtered_groups = df.groupby('Company').filter(filter_func)
print(filtered_groups)

项目表 Project: 

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| project_id  | int     |
| employee_id | int     |
+-------------+---------+
主键为 (project_id, employee_id)。
employee_id 是员工表 Employee 表的外键。
这张表的每一行表示 employee_id 的员工正在 project_id 的项目上工作。

员工表 Employee

+------------------+---------+
| Column Name      | Type    |
+------------------+---------+
| employee_id      | int     |
| name             | varchar |
| experience_years | int     |
+------------------+---------+
主键是 employee_id。数据保证 experience_years 非空。
这张表的每一行包含一个员工的信息。

请写一个 SQL 语句,查询每一个项目中员工的 平均 工作年限,精确到小数点后两位

以 任意 顺序返回结果表。

查询结果的格式如下。

示例 1:

输入:
Project 表:
+-------------+-------------+
| project_id  | employee_id |
+-------------+-------------+
| 1           | 1           |
| 1           | 2           |
| 1           | 3           |
| 2           | 1           |
| 2           | 4           |
+-------------+-------------+

Employee 表:
+-------------+--------+------------------+
| employee_id | name   | experience_years |
+-------------+--------+------------------+
| 1           | Khaled | 3                |
| 2           | Ali    | 2                |
| 3           | John   | 1                |
| 4           | Doe    | 2                |
+-------------+--------+------------------+

输出:
+-------------+---------------+
| project_id  | average_years |
+-------------+---------------+
| 1           | 2.00          |
| 2           | 2.50          |
+-------------+---------------+
解释:第一个项目中,员工的平均工作年限是 (3 + 2 + 1) / 3 = 2.00;第二个项目中,员工的平均工作年限是 (3 + 2) / 2 = 2.50
import pandas as pd

def project_employees_i(project: pd.DataFrame, employee: pd.DataFrame) -> pd.DataFrame:
    project_t = project.merge(employee,how='left',on='employee_id')
    return project_t.groupby('project_id',as_index=False)['experience_years'].mean().rename(columns = {'experience_years':'average_years'}).round({'average_years':2})
设置 as_index=False 以保持原始索引

如果没有设置得到的结果是series类型

rename对计算得到的新列重命名

round对average_years列保留2位小数

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值