我正在处理一些数据,并希望提取特定列的最大值,并按不同的列进行分组。但是,我想根据另一列从最大计算中排除某些行。
示例:
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/