【问题标题】:Filter grouped pandas dataframe, keep all rows with minimum value in column过滤分组的熊猫数据框,保留列中具有最小值的所有行
【发布时间】:2021-07-16 08:49:32
【问题描述】:
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']

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

df.loc[df.groupby('A').C.idxmin()]

只剩下最少一行,我需要所有这些。 预期结果:

【问题讨论】:

  • 我们可以编写执行此操作的代码,但您要求有意保留重复的行,这几乎没有任何价值。您能否展示我们想要这样做的任何合法用例?
  • 另外,大多数解决方案都不会保留索引,他们会用默认的 0,1,2... 覆盖它,(但是您的原始数据框没有非默认索引,所以你不会注意到的)。但如果你这样做 df.index = list(string.ascii_lowercase)[:20] 你会看到。
  • 是的。在实际情况下(这是一个示例)我有一个包含 500k+ 行的数据框。和 B 列的值不同,因此行不重复。我很抱歉让你认为他们在现实生活中是一样的。只是复制粘贴它们。
  • 我的意思是:如果您想要保留(非默认)索引的解决方案,请编辑您的问题并提供具有(非默认)索引的数据示例。您已经接受了一个不接受的解决方案。

标签: python pandas pandas-groupby


【解决方案1】:

让我们尝试使用groupby.transform 来获得每组 C 的最小值,并与df['C'] 进行比较,并保持那些等于最小值的C 值:

df.loc[df.groupby('A')['C'].transform('min').eq(df['C'])].reset_index(drop=True)
        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

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 2019-03-08
    • 2014-01-09
    • 2017-01-16
    • 2018-04-03
    • 1970-01-01
    相关资源
    最近更新 更多