求B列中具有A列中K个最大元素之一的行中的值的平均值:Pandas Dataframe GroupBy Obj

2024-10-01 17:24:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个panda数据帧,叫做df1,有很多列(col1,col2,…)

我想将数据分组到两个特定的列上—比如说col4col7

在每一组中,我想找到col9中的最高K值

然后,我想找到col10中值的平均值,,它们满足col9中具有最高K值的条件

我试图解决它如下所示:

consideredCols = ['col4', 'col7']
k_value = 3
grp_data = df1.groupby(consideredCols)
print(grp_data.apply(lambda grp: (grp.col9.nlargest(k_value)).mean('col10')))

示例:(显示在groupby['col4','col7']阶段之后)

                col9    col10
col4    col7        
john    doe        5    12
                   4    15
                  11    9
                   4    14


jane    doe       42    421
                  50    42
                 124    27
                  15    25

如果这里的K=2,那么我希望约翰的结果是(12+9)/2,简的结果是(42+27)/2


Tags: 数据datavaluepandacol2col1df1groupby
1条回答
网友
1楼 · 发布于 2024-10-01 17:24:04

很接近了-需要^{}表示不丢失列col10,然后得到mean

grp_data = df1.groupby(consideredCols)
print(grp_data.apply(lambda grp: (grp.nlargest(k_value, 'col9'))['col10'].mean()))

col4  col7
jane  doe     34.5
john  doe     10.5
dtype: float64

具有^{}^{}的另一种解决方案:

out = (df1.sort_values(['col4','col7','col9'], ascending=[True, True, False])
              .groupby(consideredCols)
              .apply(lambda grp: grp.head(2)['col10'].mean()))
print (out)

col4  col7
jane  doe     34.5
john  doe     10.5
dtype: float64

out = (df1.sort_values(['col4','col7','col9'], ascending=[True, True, False])
              .groupby(consideredCols)
              .apply(lambda grp: grp.head(2)['col10'].mean())).mean()
print (out)
22.5

为了更好地理解函数,最好使用^{}创建自定义函数并使用print,然后可以使用lambda函数重写它:

consideredCols = ['col4', 'col7']
k_value = 2

def f(grp):
     print (grp)

     print (grp.nlargest(k_value, 'col9'))
     print (grp.nlargest(k_value, 'col9')['col10'].mean())

     return grp.nlargest(k_value, 'col9')['col10'].mean()

grp_data = df1.groupby(consideredCols)
print(grp_data.apply(f))

相关问题 更多 >

    热门问题