首页 > 解决方案 > Pandas - 从 groupby 操作的前 n 组创建一个新的 DataFrame

问题描述

具有以下DF:

   A   B
0  1  11
1  2  22
2  2  22
3  3  33
4  3  33

我想 groupby 'A' 然后取前 n 个组并从中创建一个新的数据框。我环顾四周,找到了这个答案

result = [g[1] for g in list(grouped)[:3]]

但是该解决方案返回一个列表而不是 DF,此外,从分组结果创建一个列表似乎是多余的。

更新: 预期输出是由前 n 个组组成的新 DF,例如,如果n=2输出是:

   A   B
0  1  11 <-- first group
1  2  22 <-- second group
2  2  22 <-- second group

任何帮助,将不胜感激

标签: pythonpandaspandas-groupby

解决方案


从技术上讲,您不能:组不一定按照您的数据框的顺序:grouped按分组列排序的结果(默认情况下,可以关闭),然后定义顺序。换句话说,应使用分组列(此处为 A)中的值访问各个组。

在您的情况下,这可能有效:

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 2, 3, 3], 'B': [11, 22, 22, 33, 33]})
grouped = df.groupby('A')
n = 2
df = pd.concat([group for name, group in grouped][:n])
print(df)

产生

   A   B
0  1  11
1  2  22
2  2  22

但如果输入数据框如下(注意列中值的顺序):

import pandas as pd

df = pd.DataFrame({'A': [2, 2, 3, 3, 1], 'B': [22, 22, 33, 33, 11]})
grouped = df.groupby('A')
n = 2
df = pd.concat([group for name, group in grouped][:n])
print(df)

前两个分组连接仍然是

   A   B
4  1  11
0  2  22
1  2  22

因为这些组是按“A”列中的值排序的。(请注意这些值与以前的情况相同;但是,索引不同。)

因此,对于一组 groupby 结果,没有真正的“前 n 个元素”。


推荐阅读