猿问

保留最高绝对值并从具有重复索引的行中返回平均值

我在 DataFrame 中有一组具有重复索引的值:


         value

CDE   2.318620

CDE  -3.097715

LXU  -3.791043

LXU   4.818995

SWN   3.059964

SWN  -4.349304

OAS  -3.336539

LPI  -3.037097

LPI  -5.701044

LPI  -3.519923

CZR  -3.270018

CZR  -3.056712

所需的结果是仅保留最高绝对值并在新列中返回平均值:


         value    average

CDE  -3.097715  -0.389547

LXU   4.818995   0.513976

SWN  -4.349304  -0.644670

OAS  -3.336539  -3.336539

LPI  -5.701044  -4.086021

CZR  -3.270018  -3.163365

我试图将 .apply(lambda) 应用于重复的行,但出现“轴”错误:


max_absolute = lambda x: max(x.min(), x.max(), key=abs)

df_duplicate_absmax = df.groupby(df.index).apply(max_absolute, axis=1)

ps:调整 Abhi 的解决方案以使用 NaN:


df1 = df.groupby(df.index)['value'].agg([lambda x: max(x[~np.isnan(x)], key=abs), 'mean'])


catspeake
浏览 177回答 3
3回答

米琪卡哇伊

用:df1 = df.groupby(df.index)['value'].agg([lambda x: max(x,key=abs), 'mean'])df1.columns = ['value', 'average']print (df1)        value   averageCDE -3.097715 -0.389547CZR -3.270018 -3.163365LPI -5.701044 -4.086021LXU  4.818995  0.513976OAS -3.336539 -3.336539SWN -4.349304 -0.644670

倚天杖

这是一个使用groupby+agg和两个函数的解决方案,一个通过绝对值计算最大值,另一个计算平均值:def max_abs(x):    return x.iloc[x.abs().values.argmax()]res = df.groupby(level=0).agg([max_abs, 'mean'])\        .xs('value', axis=1, drop_level=True)print(res)      max_abs      meanCDE -3.097715 -0.389547CZR -3.270018 -3.163365LPI -5.701044 -4.086021LXU  4.818995  0.513976OAS -3.336539 -3.336539SWN -4.349304 -0.644670
随时随地看视频慕课网APP

相关分类

Python
我要回答