对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位小数
1051

被折叠的 条评论
为什么被折叠?



