查找特定行数 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】:
这是一种基于 numpy 的方法,使用 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 数据帧的平均值的主要内容,如果未能解决你的问题,请参考以下文章