查找特定行数 pandas 数据帧的平均值

Posted

技术标签:

【中文标题】查找特定行数 pandas 数据帧的平均值【英文标题】:Find average of values over certain row number pandas dataframe 【发布时间】:2020-06-26 14:36:59 【问题描述】:

我有一个这样设置的数据框。

    Date    Daily Risk Score
0   2020-06-26  6.0
1   2020-06-27  6.0
2   2020-06-28  6.0
3   2020-06-29  6.0
4   2020-06-30  6.0
5   2020-07-01  6.0
6   2020-07-02  6.0
7   2020-07-03  6.0
8   2020-07-04  6.0
9   2020-07-05  6.0
10  2020-07-06  6.0
11  2020-07-07  6.0
12  2020-07-08  6.0
13  2020-07-09  6.0
14  2020-06-26  6.0
15  2020-06-27  6.0
16  2020-06-28  6.0
17  2020-06-29  6.0
18  2020-06-30  6.0
19  2020-07-01  6.0
20  2020-07-02  6.0
21  2020-07-03  6.0
22  2020-07-04  6.0
23  2020-07-05  6.0
24  2020-07-06  6.0
25  2020-07-07  6.0
26  2020-07-08  6.0
27  2020-07-09  6.0

我想取整个数据帧(50k+ 个条目)中所有相似天数的平均值。如何遍历每个日期,然后在末尾创建一列,列出 14 个值,这些值对应于每天的平均值?

预期的输出是:

  Date  Daily Risk Score  Mean
0   2020-06-26  6.0   a
1   2020-06-27  6.0   b
2   2020-06-28  6.0   c 
3   2020-06-29  6.0   ...
4   2020-06-30  6.0
5   2020-07-01  6.0
6   2020-07-02  6.0
7   2020-07-03  6.0
8   2020-07-04  6.0
9   2020-07-05  6.0
10  2020-07-06  6.0
11  2020-07-07  6.0
12  2020-07-08  6.0
13  2020-07-09  6.0
14  2020-06-26  6.0
15  2020-06-27  6.0
16  2020-06-28  6.0
17  2020-06-29  6.0
18  2020-06-30  6.0
19  2020-07-01  6.0
20  2020-07-02  6.0
21  2020-07-03  6.0
22  2020-07-04  6.0
23  2020-07-05  6.0
24  2020-07-06  6.0
25  2020-07-07  6.0
26  2020-07-08  6.0
27  2020-07-09  6.0

其中 a 代表 6-26 日所有每日风险评分的平均值。 B 是 6-27 的平均值,以此类推。

【问题讨论】:

df.Value.iloc[::3].mean()? 对于所有行,以这种方式对它们进行分组?请分享预期输出 那我该如何进入下一组呢?假设我想从第二个值 (2) 开始。会是 df['Value'].iloc[1:3].mean() 吗? 它必须适用于所有行@Ch3steR 语法为 df['Value'].iloc[start:stop:step],所以 df.iloc[::3] 从 0 开始,在行尾停止并迭代 3 项一次。要从第 2 行开始,请使用 df.iloc[1::3] (从索引 1/第 2 行开始,一次迭代 3 个项目直到行结束) 【参考方案1】:

这是一种基于 n​​umpy 的方法,使用 view_as_windows 获取列值的滚动窗口视图,步长为 3。使用这种方法,如果整个窗口不存在,则省略输出。

from skimage.util import view_as_windows

a = df['Value'].to_numpy()
# strided view of a with a step size of 3
w = view_as_windows(a, len(a)//3, step=3)
# missing values not present in strided view (incomplete window)
missing = a[w.size:]
prev_means = w.mean(0)
# construct new array with missing values and means of w
# if no missing values, the mean is kept
prev_means[:len(missing)] = a[w.size:]
means = np.vstack([w, prev_means]).mean(0)
# new df column
new_col = np.full(len(a), np.nan)
new_col[:len(means)] = means
df['means'] = new_col

print(df)

    Value     means
0       1  3.000000 # (1+4+2+5)/4
1       2  4.000000 # (2+5+3+6)/4
2       3  2.666667 # (3+1+4)/3
3       4       NaN
4       5       NaN
5       1       NaN
6       2       NaN
7       3       NaN
8       4       NaN
9       5       NaN
10      6       NaN

【讨论】:

我编辑了我原来的问题,以更好地反映我到底在寻找什么。很抱歉造成混乱...【参考方案2】:

您可以尝试使用np.r_np.nanmean

def mean_window(arr, s):
    l = len(arr)
    fill_values = (s - l%s) if l%s else 0
    return np.nanmean(np.r_[arr,[np.nan]*fill_values].reshape(-1,s),axis=0)

mean_window(df.Value.to_numpy, 3)
# array([3.        , 4.        , 2.66666667])

详情

def mean_window(arr, s):
    l = len(arr)
    fill_values = (s - l%s) if l%s else 0
    print(np.r_[arr,[np.nan]*fill_values].reshape(-1,s)

mean_window(df.Value.to_numpy(), 3)
# [[ 1.     2.        3.]
#  [ 4.     5.        1.]
#  [ 2.     3.        4.]
#  [ 5.     6.       nan]]
#     |      |          |
# arr[::3] arr[1::3] arr[2::3]

mean_window(df.values.to_numpy(), 4)
# [[ 1.     2.       3.        4.]
#  [ 5.     1.       2.        3.]
#  [ 4.     5.       6.       nan]]
#    |      |         |         |
# arr[::4] arr[1::4] arr[2::4] arr[3::4]

【讨论】:

【参考方案3】:
df[::3]['Value'].mean()  

这得到了你想要的,但你还想把它分配给一个列,你希望这个结果是什么样子的?

【讨论】:

列名将是我可以自己分配的日期,但理想情况下它只是具有平均值的一行。

以上是关于查找特定行数 pandas 数据帧的平均值的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas:计算可变行数的滚动平均值(移动平均值)

根据时间频率将特定函数应用于数据帧的某个子集

如何获得与R一样的Pandas数据帧的类似摘要?

在 Pandas 数据框中查找每三列的平均值

Pandas:交换一个数据框中的特定列值并计算其加权平均值

Pandas - 用特定组的平均值替换列中的 NaN