在pandas中,groupby
是一种强大的数据聚合操作,它允许我们按照某些条件将数据分组,然后对每个组应用聚合函数。有时我们需要从每个组中获取前N个结果,而不是对整个组进行聚合。
nlargest()
或nsmallest()
import pandas as pd
# 示例数据
df = pd.DataFrame({
'group': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'],
'value': [10, 20, 30, 15, 25, 35, 5, 15]
})
# 获取每个组中value列最大的2个值
result = df.groupby('group')['value'].nlargest(2)
print(result)
apply()
和head()
# 获取每个组的前2行
result = df.groupby('group').apply(lambda x: x.head(2))
print(result)
sort_values()
和groupby().head()
# 先按value降序排序,然后获取每个组的前2个
result = df.sort_values('value', ascending=False).groupby('group').head(2)
print(result)
rank()
方法# 为每个组内的value创建排名
df['rank'] = df.groupby('group')['value'].rank(ascending=False)
# 筛选排名前2的记录
result = df[df['rank'] <= 2]
print(result)
nlargest()
通常比先排序再取前N个更高效sort_values()
指定多个列groupby().nth()
获取特定位置的行# 更复杂的例子:多列排序和分组
df = pd.DataFrame({
'department': ['HR', 'HR', 'HR', 'IT', 'IT', 'IT', 'Sales', 'Sales'],
'employee': ['Alice', 'Bob', 'Charlie', 'Dave', 'Eve', 'Frank', 'Grace', 'Hank'],
'salary': [70000, 80000, 90000, 85000, 95000, 75000, 60000, 65000],
'years': [5, 3, 7, 4, 2, 6, 1, 3]
})
# 获取每个部门薪资最高的2名员工,如果薪资相同则按工作年限排序
result = (
df.sort_values(['department', 'salary', 'years'], ascending=[True, False, False])
.groupby('department')
.head(2)
)
print(result)
这些方法可以根据具体需求灵活组合使用,以满足不同的数据分析场景。
没有搜到相关的文章