我的数据看起来像这样:
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的解决方案也可能。
谢谢。
答案 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)