重新组织字符串输入并计算基本python或numpy中的平均值

时间:2014-11-18 20:14:15

标签: python numpy

我的数据看起来像这样:

met = """
       A     B   C    D    E     F
idx1   1     3   5    5    7     10
idx2   2     3   6    12   6     1
.... """" 

我想要的是这个输出,其中X是A和D的平均值,Y是B和E的平均值,Z是C和F的平均值。

output = """
         X    Y    Z
idx1      3   5    7.5
idx2      7   4.5  3.5 """

考虑如何解决这个问题:我基本上考虑在两部分中对每一行进行切片,然后计算每个部分中相应值的平均值(索引1为1; 2为2,3,为3)和输出结果。

我更愿意看看我是否可以在基本pytho中有效地做到这一点,但另外一个涉及numpy或pandas的解决方案也可能。

谢谢。

1 个答案:

答案 0 :(得分:1)

首先,出现该错误的原因是您尝试使用idx列表作为字典中的关键字d。您不能将列表之类的可变值用作字典键。 (否则,您可能只是改变列表,并且您的字典会突然失效。)通常的解决方案是创建一个元素与列表相同的元组(因为元组是不可变的,因此如果它们的元素是可清除的,则可以清除),比如d[tuple(idx)]

但在这种情况下,这没有任何意义。这样做只会将每个val添加到相同的字典值上。 (实际上,它甚至不会这样做,因为list.add不存在。你可能在这里想list.append。但是,再次,它没有意义或做任何有用的事情,它不是值得投入太多精力去弄清楚如何正确行事......)如果你想要这样做,你可以跳过循环并做d[tuple(idx)] += june,但我无法想象你为什么要这样做。

我认为您要做的是为每个idx条目使用相应的june条目。你可以通过zip将两个列表组合在一起来做到这一点,但实际上,有一个更简单的方法:在生成它们时立即使用它们,而不是存储它们,然后试图找出如何在以后使用它们:

for line in mets:
    fields = line.split("\t")
    idx = fields[0]
    june = fields[1:4]
    july = fields[4::]
    d[idx] += june

然而,即使这样也没有意义。假设您对july使用june做同样的事情,这只是将fields[1:]重新添加到一起。

从你的intermediate,看起来你真正想要的是将idx和june-to-july-ness一起用作关键。这很容易:

d = {}
for line in mets:
    fields = line.split("\t")
    idx = fields[0]
    june = fields[1:4]
    july = fields[4::]
    d[idx, 'a'] = june
    d[idx, 'b'] = july

或许你根本不想要一个字典,只是一个清单:

d = []
for line in mets:
    fields = line.split("\t")
    idx = fields[0]
    june = fields[1:4]
    july = fields[4::]
    d.append([idx, 'a'] + june)
    d.append([idx, 'b'] + july)