【问题标题】:Averaging column values by several intervals in Python在 Python 中按多个间隔平均列值
【发布时间】:2019-03-28 22:10:00
【问题描述】:

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

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 中有时会出现重复。

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

intervals = [1.0, 2.0]

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

    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_ 是 Value11.0 的每个区间内的平均值(包括 (1.0 - 2.0, 2.5 - 3.0,....等)。

有没有一种简单的方法可以在循环中使用groupby

【问题讨论】:

  • 你可以用 cut 做,但你需要向我们展示边缘,比如 1 ,2 他们都进入第一个区间,所以 [1,2] 但下一个区间变成 (2,3]?
  • 对于间隔 1.0 计算,切割将在间隔 (1.0, 2.0)、(2.0, 3.0)、(3.0, 4.0)、(5.0, 6.0) 上。
  • 不,在您的展示案例中,边界包含在一个区间内,例如 1&2 在同一区间内,这不是由代码创建的趋势
  • 而且 1.0 和 2.0 也属于一个区间,为什么 5.0 5.5 和 6.0 不在同一个区间
  • 我的错误。它将是 (1.0, 2.0], (2.5, 3.0]....等

标签: python python-3.x pandas dataframe


【解决方案1】:

您可以使用数据框的apply 方法完成此操作,然后通过布尔值对满足depth + 1.0depth + 2.0 等条件的行(和关联值)进行采样。

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)

这将返回:

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

【讨论】:

    猜你喜欢
    • 2014-08-22
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多