平均 Pandas 中的数据帧切片
Averaging Slices of a Dataframe in Pandas
我有一个数据框:
df = pd.DataFrame({0: [1, 2, 5, 13], 1: [1, 4, 3, 1], 2: [1, 2, 5, 10], 3: [4, 4, 5, 3], 4: [0, 6, 1, 1], 5: [5, 6, 4, 5], 6: [0, 9, 9, 0], 7: [1, 1, 1, 1]})
df
0 1 2 3 4 5 6 7
1 1 1 4 0 5 0 1
2 4 2 4 6 6 9 1
5 3 5 5 1 4 9 1
13 1 10 3 1 5 0 1
我想取每 2 个并排元素的平均值,但每 4 列切片一次(average1 = 列 0、1、2、3,average2 = 列 1、2、3、4,average3 = 第 2、3、4、5 列 ....等)。
例如伪代码为:
for index in range(len(df.columns)):
df_1 = df.iloc[:index, index:index+1]
df_2 = df.iloc[:index, index+2:index+3]
df_avg = pd.concat([df_1, df_2]).mean(axis=1)
我想要的输出是:
df_avg
(1+1+1+4)/4 (1+1+4+0)/4 . . . . (0+5+0+1)/4
(4+2+4+6)/4 (4+2+4+6)/4 . . . . (6+6+9+1)/4
.
.
.
(13+1+10+3)/4 (1+10+3+1)/4 . . . . (1+5+0+1)/4
df_avg
1.75 1.50 . . . . 1.50
4.00 4.00 . . . . 5.50
6.75 3.75 . . . . 1.75
是否有使用 groupby().mean() 或 .rolling().mean() 方法的简单方法?
IIUC rolling
与 mean
df_ave=df.rolling(4,axis=1).mean().dropna(1)
df_ave
Out[100]:
3 4 5 6 7
0 1.75 1.50 2.50 2.25 1.50
1 3.00 4.00 4.50 6.25 5.50
2 4.50 3.50 3.75 4.75 3.75
3 6.75 3.75 4.75 2.25 1.75
第一次分裂
df1, df2 = [y for _, y in df.groupby(df.columns//4,axis=1)]
(df1.rolling(2,axis=1).mean().dropna(1).values + df2.rolling(2,axis=1).mean().dropna(1).values)/2
Out[112]:
array([[1.75, 1.75, 1.5 ],
[4.5 , 5.25, 4. ],
[3.25, 5.25, 5. ],
[5. , 4. , 3.5 ]])
我有一个数据框:
df = pd.DataFrame({0: [1, 2, 5, 13], 1: [1, 4, 3, 1], 2: [1, 2, 5, 10], 3: [4, 4, 5, 3], 4: [0, 6, 1, 1], 5: [5, 6, 4, 5], 6: [0, 9, 9, 0], 7: [1, 1, 1, 1]})
df
0 1 2 3 4 5 6 7
1 1 1 4 0 5 0 1
2 4 2 4 6 6 9 1
5 3 5 5 1 4 9 1
13 1 10 3 1 5 0 1
我想取每 2 个并排元素的平均值,但每 4 列切片一次(average1 = 列 0、1、2、3,average2 = 列 1、2、3、4,average3 = 第 2、3、4、5 列 ....等)。
例如伪代码为:
for index in range(len(df.columns)):
df_1 = df.iloc[:index, index:index+1]
df_2 = df.iloc[:index, index+2:index+3]
df_avg = pd.concat([df_1, df_2]).mean(axis=1)
我想要的输出是:
df_avg
(1+1+1+4)/4 (1+1+4+0)/4 . . . . (0+5+0+1)/4
(4+2+4+6)/4 (4+2+4+6)/4 . . . . (6+6+9+1)/4
.
.
.
(13+1+10+3)/4 (1+10+3+1)/4 . . . . (1+5+0+1)/4
df_avg
1.75 1.50 . . . . 1.50
4.00 4.00 . . . . 5.50
6.75 3.75 . . . . 1.75
是否有使用 groupby().mean() 或 .rolling().mean() 方法的简单方法?
IIUC rolling
与 mean
df_ave=df.rolling(4,axis=1).mean().dropna(1)
df_ave
Out[100]:
3 4 5 6 7
0 1.75 1.50 2.50 2.25 1.50
1 3.00 4.00 4.50 6.25 5.50
2 4.50 3.50 3.75 4.75 3.75
3 6.75 3.75 4.75 2.25 1.75
第一次分裂
df1, df2 = [y for _, y in df.groupby(df.columns//4,axis=1)]
(df1.rolling(2,axis=1).mean().dropna(1).values + df2.rolling(2,axis=1).mean().dropna(1).values)/2
Out[112]:
array([[1.75, 1.75, 1.5 ],
[4.5 , 5.25, 4. ],
[3.25, 5.25, 5. ],
[5. , 4. , 3.5 ]])