【问题标题】:Calculating the mean values between every row inside a range计算范围内每一行之间的平均值
【发布时间】:2020-11-09 15:18:23
【问题描述】:

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

我想要做的是计算每个给定行的平均值,从 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 类的平均值。

【问题讨论】:

    标签: python arrays python-3.x numpy dataframe


    【解决方案1】:

    为组创建具有整数除法和模数的辅助数组,并传递给 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
    

    【讨论】:

    • 它和我做的一样,但这是不正确的。基本上,我想对 0-50、150-200、250-300、350-400、450-500、550-600、650-700 的行求和,然后将这些行相加并将它们除以 7,然后将是 A 类的平均值,然后我可以重复 B 类的过程,但对于其他值
    • @JohnJones - 所以需要将mean 更改为sum 并除以7 吗?如何验证输出数据的正确性?
    • 这些类是错误的,因为我的尝试是我的代码,这就是我试图以这种方式取平均值的原因。将其更改为 sum,它不能保证正确性,这就是为什么我问如何从第 50 行到第 100 行求和,例如 7 个不同的行
    • @JohnJones - 所以需要更改 s = np.arange(len(df)) // N 吗?
    • 为什么?我尝试实施你的解决方案,它不计算手段
    猜你喜欢
    • 2019-11-09
    • 2020-06-25
    • 2018-02-28
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多