首页 > 解决方案 > 计算范围内每一行之间的平均值

问题描述

我有一个大小为 700x20 的数据框。我的数据是图像上特定位置的像素强度坐标,我有 14 个人,每个人有 50 张图像。我正在尝试执行降维,对于这样的任务,其中一个步骤需要我计算每个类之间的平均值,其中我有两个类。在我的数据框中,每 50 行是属于一个类的特征,因此 A 类有 0 到 50 个特征,B 类有 51 到 100 个特征,A 类有 101-150 个,类有 151-200 个乙等。

我想要做的是计算每个给定行的平均值,从 N 到 M 并计算平均值。这是数据框的链接,以便更好地可视化问题:Dataframe pickle file

我尝试的是对数据框进行排序并单独计算,但它不起作用,它计算了每一行的平均值并将它们分组为 14 个不同的类。

class_feature_means = pd.DataFrame(columns=target_names)
for c, rows in df.groupby('class'):
    class_feature_means[c] = rows.mean()
class_feature_means

最小的可重现示例:

my_array = np.asarray([[31, 25, 17, 62],
 [31, 26, 19, 59,],
 [31, 23, 17, 67,],
 [31, 23, 19, 67,],
 [31, 28, 17, 65,],
 [32, 26, 19, 62,],
 [32, 26, 17, 66,],
 [30, 24, 17, 68],
 [29, 24, 17, 68],
 [33, 24, 17, 68],
 [32, 52, 16, 68],
 [29, 24, 17, 68],
 [33, 24, 17, 68],
 [32, 52, 16, 68],
 [29, 24, 17, 68],
 [33, 24, 17, 68],
 [32, 52, 16, 68],
 [30, 25, 16, 97]])


my_array = my_array.reshape(18, 4)

my_array = my_array.reshape(18, 4)
indices = sorted(list(range(0,int(my_array.shape[0]/3)))*3)
class_dict = dict(zip(range(0,int((my_array.shape[0]/3))), string.ascii_uppercase))
target_names = ["Index_" + c for c in class_dict.values()]
pixel_index = [1, 2, 3, 4]


X = pd.DataFrame(my_array, columns= pixel_index)
y = pd.Categorical.from_codes(indices,target_names)
df = X.join(pd.Series(y,name='class'))


df
    

基本上我想要做的是分组到一个独特的A,C,E类,将它们的总和除以3,因此达到A类的平均值或者我们称之为0类。然后,组合成一个独特的B,D类, F 将它们的和除以 3,因此达到 B 类或 1 类的平均值。

标签: pythonarrayspython-3.xnumpydataframe

解决方案


为组创建具有整数除法和模数的辅助数组,并传递给 groupby 以进行聚合sum,最后除法:

N = 3
arr = np.arange(len(df)) // N % 2
print (arr)
[0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1]

df = df.groupby(arr).sum() / N
print (df)
           1          2          3           4
0  92.666667  82.666667  51.333333  198.000000
1  94.333333  92.666667  51.333333  210.333333

推荐阅读