在basic python或numpy中重新组织字符串输入并计算平均值

2024-05-15 22:35:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的数据:

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的解决方案也可能是

谢谢你


Tags: 数据numpypandasoutput解决方案平均值met考虑一下
1条回答
网友
1楼 · 发布于 2024-05-15 22:35:32

首先,这个错误的原因是您试图使用idx,一个列表,作为字典中的键d。不能使用列表等可变值作为字典键(否则,您可能只是改变列表,而您的字典将突然无效。)通常的解决方案是创建一个元组,其中包含与列表相同的元素(因为元组是不可变的,因此如果它们的元素是可散列的,则可以散列),如d[tuple(idx)]

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

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

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和六月与七月的对比作为一个键。这很简单:

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)

相关问题 更多 >