首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >保留最高绝对值并从具有重复索引的行返回平均值。

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

Stack Overflow用户
提问于 2018-12-09 01:19:10
回答 3查看 858关注 0票数 2

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

代码语言:javascript
复制
         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

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

代码语言:javascript
复制
         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),但是得到了一个“轴”错误:

代码语言:javascript
复制
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一起工作:

代码语言:javascript
复制
df1 = df.groupby(df.index)['value'].agg([lambda x: max(x[~np.isnan(x)], key=abs), 'mean'])
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-09 01:27:07

使用:

代码语言:javascript
复制
df1 = df.groupby(df.index)['value'].agg([lambda x: max(x,key=abs), 'mean'])

df1.columns = ['value', 'average']

print (df1)

        value   average
CDE -3.097715 -0.389547
CZR -3.270018 -3.163365
LPI -5.701044 -4.086021
LXU  4.818995  0.513976
OAS -3.336539 -3.336539
SWN -4.349304 -0.644670
票数 2
EN

Stack Overflow用户

发布于 2018-12-09 01:53:56

这里有一个使用groupby + agg的解决方案,它有两个函数,一个用绝对值计算最大值,另一个用来计算平均值:

代码语言:javascript
复制
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      mean
CDE -3.097715 -0.389547
CZR -3.270018 -3.163365
LPI -5.701044 -4.086021
LXU  4.818995  0.513976
OAS -3.336539 -3.336539
SWN -4.349304 -0.644670
票数 1
EN

Stack Overflow用户

发布于 2018-12-09 01:59:19

代码语言:javascript
复制
from io import StringIO
import pandas as pd
df = pd.read_fwf(StringIO("""
cod      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
"""), header=1, Index=None)

# Create a new column with absoulte value
df['abs_value'] = df['value'].abs()

# Calulate the mean in new data farame, grouped by code using
# pandas groupped aggregation naming the column average
df_avg = df.groupby("cod").value.agg([('average', 'mean')])

# Choose the row within group with largest abs value
df_abs = df.sort_values("abs_value").groupby("cod").tail(1)[["cod", "value"]]

# Join the average and the max
df_abs.join(df_avg, on="cod")

结果:

代码语言:javascript
复制
    cod     value   average
1   CDE -3.097715 -0.389547
10  CZR -3.270018 -3.163365
6   OAS -3.336539 -3.336539
5   SWN -4.349304 -0.644670
3   LXU  4.818995  0.513976
8   LPI -5.701044 -4.086021
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53688581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档