过滤分组的 pandas 数据框,保留列中具有最小值的所有行

Joh*_*nny 1 python pandas pandas-groupby

df = pd.DataFrame([['SAM', 23, 1],
                   ['SAM', 23, 2],
                   ['SAM', 23, 1],
                   ['SAM', 23, 3],
                   ['BILL', 36, 1],
                   ['BILL', 36, 2],
                   ['BILL', 36, 3],
                   ['BILL', 36, 1],
                   ['JIMMY', 33, 4],
                   ['JIMMY', 33, 2],
                   ['JIMMY', 33, 2],
                   ['JIMMY', 33, 3],
                   ['CARTER', 25, 3],
                   ['CARTER', 25, 4],
                   ['CARTER', 25, 5],
                   ['CARTER', 25, 4],
                   ['GRACE', 27, 4],
                   ['GRACE', 27, 5],
                   ['GRACE', 27, 6],
                   ['TOMMY', 32, 7]])
df.columns = ['A', 'B', 'C']
Run Code Online (Sandbox Code Playgroud)

我需要将具有按“A”列分组的“C”列最小值的所有行保留在数据框中,并保持 B 不变。这里有几乎相同的主题 ,但如果我使用

df.loc[df.groupby('A').C.idxmin()]
Run Code Online (Sandbox Code Playgroud)

只剩下最少一行,而我需要全部。预期结果:

预期结果的图像

Hen*_*ker 5

让我们尝试groupby.transform获取每组 C 的最小值,并与df['C']这些值进行比较并保留C等于最小值的值:

df.loc[df.groupby('A')['C'].transform('min').eq(df['C'])].reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)
        A   B  C
0     SAM  23  1
1     SAM  23  1
2    BILL  36  1
3    BILL  36  1
4   JIMMY  33  2
5   JIMMY  33  2
6  CARTER  25  3
7   GRACE  27  4
8   TOMMY  32  7
Run Code Online (Sandbox Code Playgroud)