Python Pandas 基于列分组并获取最大值,但基于另一列排除

标签 python pandas

我正在处理一些数据,并希望提取特定列的最大值,并按不同的列进行分组。但是,我想根据另一列从最大计算中排除某些行。

示例:

df = pd.DataFrame({'Col1':['A','A','A','B','B','B','B'],
                   'Col2':['Build','Plan','Other','Test','Build','Other','Buy'],
                   'Col3':[2,5,17,5,13,12,12]})

我想要获取按 Col1 分组的 Col3 的最大值,同时排除 Col2 中具有“其他”的任何行。因此“A”的 Col3 最大值应该是 5,而不是 17。

我能够使用以下方法获得按 Col1 分组的 Col3 的最大值:df['new'] = df.groupby(['Col1'])['Col3'].transform(max) 然而,这会给我 A 的值 17。

通过查看其他线程,我尝试使用:

x = df1.groupby(['Col1'])
x2 = x.apply(lambda g: g[g['Col2'] != 'Other'])

这似乎让我很接近(它的数据按 Col1 分组,并根据 Col2 删除行)。但是,我似乎无法找到一种方法来根据 Col1 获得 Col3 的最大值。

我最多能够使用:x2['Col3'].max() 在删除 Col2 中带有“其他”的所有行后获取 Col3 的最大值。但是,我无法获得按 Col1 分组的 Col3 的最大值。

我想知道是否有一种方法可以使用内置的 Pandas 函数来相对简单地完成此操作,而不是创建一个全新的定制函数?

最佳答案

你可以试试

df[df.Col2 != 'Other'].groupby('Col1').Col3.max()

Col1
A     5
B    13

创建新列:

df['new']=df[df.Col2 != 'Other'].groupby('Col1').Col3.transform('max')
df['new'] = df.new.ffill()

    Col1    Col2    Col3    new
0   A       Build   2       5.0
1   A       Plan    5       5.0
2   A       Other   17      5.0
3   B       Test    5       13.0
4   B       Build   13      13.0
5   B       Other   12      13.0
6   B       Buy     12      13.0

解释:仅选择 df 中 Col2 值不等于“其他”的行,按 Col1 分组,查找 Col3 的最大值。

Here是转换的文档: 它返回一个带有转换值的类似索引 df,而不是聚合。

关于Python Pandas 基于列分组并获取最大值,但基于另一列排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44222655/

相关文章:

python - 如何在 Python IDE : Spyder? 中缩进代码块

jquery - 提交表单而不刷新/重定向当前页面(Python(Django)+ jQuery + Ajax)

python - 如何应用于具有多索引列的数据框中的一组列

python - 将元组列表转换为 Pandas 系列

python - Pandas 中的小时系列到矩阵

python Bottle集成测试

python - 如何遍历python中的两列?

python - 文本解释为 bool 值

python - 将行追加到数据框时遇到困难

python - 填补 Pandas 数据框中缺失的日子