0

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

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 列。我在这里考虑三步计算。

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

  2. 将第 1~5 列的所有其他编号重新分配到基于第 6 列的相应小节中。如果特定部分没有编号,则将其打印为 0。将有 n 个子部分。每个小节中的元素数量将是随机的。

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

我正在尝试使用多个 for 循环,但它变得太复杂了,并且出错了。有没有其他简单的方法来对数据进行分类、处理每个子部分并在 Python 中打印出来?此外,我的 for 循环根本不起作用。任何使用此数据的简单示例建议?

4

3 回答 3

2

此任务适用于 pandas 库。(http://pandas.pydata.org/)根据我从您的帖子中了解到的情况,您想计算列均值和标准差。要计算行统计,请将参数添加axis=1到 mean 和 std 函数。在下面的代码中,示例已保存到“tmp.txt”。第一步加载它;然后计算数据帧上的统计信息很简单。

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

有关 pandas 的更多信息,请查看快速介绍: http: //pandas.pydata.org/pandas-docs/stable/10min.html

于 2013-08-27T21:58:20.700 回答
0

正如其他人所说,您可能想研究 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]))

将此扩展到多个/不同的列和函数应该是微不足道的。

于 2013-08-27T22:00:43.107 回答
0

我将假设您的矩阵在列表列表中,并向您展示如何开始。(但是,正如我在评论中提到的那样,如果您将矩阵放在 numpyarraymatrix中,这一切都会容易得多,而且速度也更快。)


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

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

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

Python 附带了一个groupby函数,可以在这里完成大部分您想要的操作,但您必须先对数据进行排序。

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

但实际上,您不想使用第 6 列的值作为键,您想使用第 6 列的数值。对于前者,您将使用itemgetterstdlib 中的函数,但要执行更复杂的操作,您最好为它编写一个函数:

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 上的stats模块是一个不错的选择,特别是现在(稍作改动)它可能最终会出现在即将发布的 Python 版本的标准库中。

但我只会显示平均值,因为那是微不足道的。

所以:

def mean(sequence):
    return sum(sequence) / len(sequence)

for k, g in groups:
    rows = list(g)
    print(k)
    for column_index in 2, 3, 4:
        column = [row[column_index] for row in rows]
        print(mean(column))

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

于 2013-08-27T22:00:17.260 回答