首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中按几个间隔计算列值的平均值

在Python中按几个间隔计算列值的平均值
EN

Stack Overflow用户
提问于 2019-03-29 06:10:00
回答 1查看 255关注 0票数 2

我有一个包含深度和其他值列的数据帧:

代码语言:javascript
复制
data = {'Depth': [1.0, 1.0, 1.5, 2.0, 2.5, 2.5, 3.0, 3.5, 4.0, 4.0, 5.0, 5.5, 6.0], 
'Value1':[44, 46, 221, 12, 47, 44, 67, 90, 100, 111, 112, 120, 122], 
'Value2': [55, 65, 76, 45, 55, 58, 23, 12, 32, 20, 22, 26, 36]}

df = pd.DataFrame(data)

正如您有时可以看到的,在Depth中有重复的地方。

我希望能够以某种方式分组间隔,并对它们进行平均。例如,我想要的输出是:

代码语言:javascript
复制
intervals = [1.0, 2.0]

获取间隔列表,并将这些间隔上的数据集分解为每值平均 (Value1,Value2),以获得:

代码语言:javascript
复制
    Depth  Value1  Value2   Avg1_1  Avg2_1  Avg1_2   Avg2_2   
0     1.0      44      55   80.75   60.25   78.2     .
1     1.0      46      65   80.75   60.25   78.2     .
2     1.5     221      76   80.75   60.25   78.2     .
3     2.0      12      45   80.75   60.25   78.2
4     2.5      47      55   52.67   .       78.2
5     2.5      44      58   52.67   .       78.2
6     3.0      67      23   52.67   .       78.2 
7     3.5      90      12   100.33          78.2
8     4.0     100      32   100.33          78.2
9     4.0     111      20   100.33          78.2
10    5.0     112      22   112             .
11    5.5     120      26   121             .
12    6.0     122      36   121             .

其中Avg1_是每个1.0间隔内Value1的平均值(包括(1.0 - 2.0,2.5 - 3.0,....etc)。

有没有在循环中使用groupby来实现这一点的简单方法?

EN

回答 1

Stack Overflow用户

发布于 2019-03-29 06:39:39

您可以使用数据帧的apply方法来实现这一点,然后通过布尔值对满足depth + 1.0depth + 2.0等条件的行(和关联值)进行采样。

代码语言:javascript
复制
df['avg1_1'] = df.apply(lambda x: (df[df['Depth'] <= x['Depth'] + 1.0]['Value1'].values.sum() / 
                                          len(df[df['Depth'] <= x['Depth'] + 1.0]['Value1'].values)),
                                            axis=1)

df['avg2_1'] = df.apply(lambda x: (df[df['Depth'] <= x['Depth'] + 1.0]['Value2'].values.sum() / 
                                  len(df[df['Depth'] <= x['Depth'] + 1.0]['Value2'].values)),
                                    axis=1)

df['avg1_2'] = df.apply(lambda x: (df[df['Depth'] <= x['Depth'] + 2.0]['Value1'].values.sum() / 
                                  len(df[df['Depth'] <= x['Depth'] + 2.0]['Value1'].values)),
                                    axis=1)

df['avg2_2'] = df.apply(lambda x: (df[df['Depth'] <= x['Depth'] + 2.0]['Value2'].values.sum() / 
                                  len(df[df['Depth'] <= x['Depth'] + 2.0]['Value2'].values)),
                                    axis=1)

这将返回:

代码语言:javascript
复制
Depth   Value1  Value2  newval  avg1_1  avg2_1  avg1_2  avg2_2
0   1.0 44  55  66.0    80.750000   60.250000   68.714286   53.857143
1   1.0 46  65  241.0   80.750000   60.250000   68.714286   53.857143
2   1.5 221 76  32.0    69.000000   59.000000   71.375000   48.625000
3   2.0 12  45  67.0    68.714286   53.857143   78.200000   44.100000
4   2.5 47  55  64.0    71.375000   48.625000   78.200000   44.100000
5   2.5 44  58  87.0    71.375000   48.625000   78.200000   44.100000
6   3.0 67  23  110.0   78.200000   44.100000   81.272727   42.090909
7   3.5 90  12  120.0   78.200000   44.100000   84.500000   40.750000
8   4.0 100 32  131.0   81.272727   42.090909   87.384615   40.384615
9   4.0 111 20  132.0   81.272727   42.090909   87.384615   40.384615
10  5.0 112 22  140.0   87.384615   40.384615   87.384615   40.384615
11  5.5 120 26  142.0   87.384615   40.384615   87.384615   40.384615
12  6.0 122 36  NaN 87.384615   40.384615   87.384615   40.384615
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55407624

复制
相关文章

相似问题

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