Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对数据进行分类,计算每个类别的平均值和标准差_Python_Categorization - Fatal编程技术网

Python 对数据进行分类,计算每个类别的平均值和标准差

Python 对数据进行分类,计算每个类别的平均值和标准差,python,categorization,Python,Categorization,我正在编写一个代码来对数据进行分类,并得到平均值和标准偏差。以下是我的数据示例 3917 1 -0.662261 25.148 22.9354 68.8076 3918 1 12.7649 18.7451 7.68473 69.0063 3919 1 -9.56836 -23.3265 -61.953 68.8357 3920 1 11.6292 31.6525 -29.3697 69.1372 3921 2 26.4837 -66.7897 12.0257 69.2282 3922

我正在编写一个代码来对数据进行分类,并得到平均值和标准偏差。以下是我的数据示例

3917 1 -0.662261 25.148 22.9354 68.8076 
3918 1 12.7649 18.7451 7.68473 69.0063 
3919 1 -9.56836 -23.3265 -61.953 68.8357 
3920 1 11.6292 31.6525 -29.3697 69.1372 
3921 2 26.4837 -66.7897 12.0257 69.2282 
3922 1 -9.81652 14.3788 9.38343 69.1217 
3923 2 39.931 -88.1879 109.498 69.1604 
3924 1 4.5502 3.53887 -6.59604 69.486 
3925 2 13.6801 -24.6628 -5.7568 69.9398 
3926 1 -10.5635 7.05517 -8.82785 70.2263
如您所见,共有6列。我在考虑三步计算法

  • 根据第6列对这些数字进行分类。第6列由0~n的浮点数组成。我希望生成n个部分(或子矩阵,或其他),比如0~1、1~2、2~3。。。。n-1~n。最后一个数字应该是最后一个数据的整数,因为我希望制作节。例如,如果最后一个数字是121.2513,则最后一个部分应为120~121以包含该数据

  • 根据第6列,将第1~5列的所有其他数字重新分配到相应的子部分。如果特定部分中没有数字,只需将其打印为0即可。将有n个小节。每个小节中的元素数量将是随机的

  • 获取每个小节第3、第4和第5列的平均值和标准偏差,并将“小节中的元素数量、小节的开始数量以及第3、第4和第5列的平均值和标准偏差”写入输出文件


  • 我尝试使用多个for循环,但它变得太复杂,并且会出错。有没有其他简单的方法可以对数据进行分类、处理每个小节并用Python打印出来?而且,我的for循环根本不起作用。有没有使用这些数据的简单示例建议

    这项任务适用于熊猫图书馆。()根据我在你文章中的理解,你想计算列式平均值和标准差。要计算行统计,请将参数“
    axis=1
    添加到均值和标准函数中。 在下面的代码中,该示例已保存到“tmp.txt”中。第一步加载它;然后就可以简单地计算数据帧上的统计信息

    import pandas as pd
    df =pd.read_csv('tmp.txt',sep=' ',header=None)
    means = df.mean()
    stds = df.std()
    

    有关熊猫的更多信息,请查看快速介绍:

    我假设您的矩阵包含在列表中,并向您展示如何开始。(然而,正如我在评论中提到的,如果您的矩阵包含在numpy
    数组中
    矩阵
    ,那么一切都会变得更简单、更快。)


    如果该值只是一个大的多行字符串,则可以将其转换为如下所示的浮点列表:

    m = [[float(col) for col in line.split()] for line in s.splitlines()]
    

    现在,通过“根据第6列对这些数字进行分类”,听起来您想要的是根据该列的整数值对它们进行分组

    Python附带了一个函数,可以完成这里所需的大部分功能,但是必须首先对数据进行排序

    在Python中,排序和分组以及相关函数总是让您传递一个键函数。您不必对第6列进行排序和分组,您可以使用第6列作为键对整行进行排序和分组

    但实际上,您不希望使用第6列的值作为键,而是希望使用第6列的整数值。对于前者,您可以使用stdlib中的函数,但要做更复杂的事情,最好为其编写一个函数:

    def keyfunc(row):
        return int(row[5])
    groups = groupby(sorted(data, key=keyfunc), key=keyfunc)
    
    (如果重复执行此操作,可能需要编写一个包装器函数,该函数使用相同的键进行排序,然后分组,这样就不必重复自己的操作,也不会出错。)

    这提供了一个内部带有迭代器的迭代器,打印出来有点困难:

    [(k, list(g)) for k, g in groups]
    
    …但你得到的是:

    [(68,
      [[3917.0, 1.0, -0.662261, 25.148, 22.9354, 68.8076],
       [3919.0, 1.0, -9.56836, -23.3265, -61.953, 68.8357]]),
     (69,
      [[3918.0, 1.0, 12.7649, 18.7451, 7.68473, 69.0063],
       [3920.0, 1.0, 11.6292, 31.6525, -29.3697, 69.1372],
       [3921.0, 2.0, 26.4837, -66.7897, 12.0257, 69.2282],
       [3922.0, 1.0, -9.81652, 14.3788, 9.38343, 69.1217],
       [3923.0, 2.0, 39.931, -88.1879, 109.498, 69.1604],
       [3924.0, 1.0, 4.5502, 3.53887, -6.59604, 69.486],
       [3925.0, 2.0, 13.6801, -24.6628, -5.7568, 69.9398]]),
     (70, [[3926.0, 1.0, -10.5635, 7.05517, -8.82785, 70.2263]])]
    
    因此,每个
    k
    是该类别分组的整数,每个
    g
    是该类别中的所有行(按排序顺序)

    (请注意,由于
    groups
    是一个迭代器,因此如果您
    print
    此,
    groups
    现在将为空。)

    这就解决了你的第一个问题,我想你的第二个问题大部分(我不确定你到底想要什么)

    对于第三种情况,首先需要迭代组:

    for k, g in groups:
    
    如果要多次循环该组,则要立即列出该组,然后循环该组

    对于每个组,您都希望对多个列执行一些统计操作。最简单的方法是使用一个模块为您处理所有的数学问题。PyPI上的模块是一个不错的选择,尤其是现在(稍作更改)它可能会在即将发布的Python版本的标准库中结束

    但我只是想说明一下,因为这很琐碎

    因此:



    这段代码可能有很多地方不能满足您的需要,但希望它足以让您开始,并在您陷入困境时提出更具体的问题。

    正如其他人所说,您可能希望研究numpy或pandas,尤其是如果您的数据集很大的话。但是,使用纯python以及正确的数据,这项任务很容易实现结构。在本例中,我只需使用defaultdict作为节,键是向下舍入的第6列,映射到列表的元组(或更复杂的数据结构),然后您可以在其中收集列值:

    from collections import defaultdict
    sections = defaultdict(lambda: ([], [], [], [], []))
    
    with open("mydata.txt") as f:
        #parse all non-empty lines into a list of lists of floats
        lines = [x.strip() for x in f.read().split("\n")]
        data = [map(float, x.split(" ")) for x in lines if x]
    
    for row in data:
        #get the corresponding section (and create it if it doesn't exist)
        section = sections[int(row[5])]
        for x in range(5):
            #append the column values to the respective lists
            section[x].append(row[x])
    
    现在,
    sections
    以易于使用的格式包含数据;只需对其进行迭代,并计算您感兴趣的行的平均值和标准偏差:

    for s, columns in sections.items():
        #assuming "mean" is a function that calculates the average of a list
        print "mean of section [%i,%i) column 3 is %f" % (s, s+1, mean(columns[2]))
    

    将其扩展到多个/不同的列和函数应该很简单。

    请在帖子中包含for循环根本不起作用……您使用的部分是什么?如果不是,有什么原因您不能这样做吗?它使此类代码简单了很多(与scipy和/或pandas一起),并避免了您在正确操作时遇到的所有显式循环。您能发布到目前为止编写的代码吗?我能问一下“分类”部分吗?我如何使用numpy或pandas根据第6列值对所有数据进行分类?我不确定您的意思,但您可以执行各种选择和分组操作。F例如,假设您只想计算t
    for s, columns in sections.items():
        #assuming "mean" is a function that calculates the average of a list
        print "mean of section [%i,%i) column 3 is %f" % (s, s+1, mean(columns[2]))