0

我在一个文件中有大量记录。

Filename     Col1   Col2   Col3  Col4
SE01_inf     name    []     NA    []
SE01_loc      NA    loc     NA    []
SE01_id       NA     []    123    []
SE01_1_inf   name1   []     NA    []
SE01_1_loc    NA     loc    NA    []

我想要一个像下面这样的综合输出

Filename     Col1   Col2   Col3  Col4
SE01         name   loc    123    []
SE01_1       name1  loc     NA    []

我不想在 excel 中执行此操作,因为数据量很大,并且在我编写函数的那一刻,excel 就会卡住。我可以使用python实现这一点吗,我不太清楚如何开始。

4

2 回答 2

2

数据量有多大?如果内存不是问题,并且您在列表中有数据,这适用于您的示例输入:

input = [['SE01_inf', 'name', [], 'NA', []],\
         ['SE01_loc', 'NA', 'loc', 'NA', []],\
         ['SE01_id', 'NA', [], '123', []],\
         ['SE01_1_inf', 'name1', [], 'NA', []],\
         ['SE01_1_loc', 'NA', 'loc', 'NA', []]]

output = {}
for row in input:
    id = row[0][:row[0].rfind('_')]
    if id not in output:
        output[id] = [id] + row[1:]
    else:
        output[id] = [new if old in ('NA', []) else old for new, old in zip(row, output[id])]

print output.values()

产生输出:

[['SE01', 'name', 'loc', '123', []], ['SE01_1', 'name1', 'loc', 'NA', []]]
于 2013-09-04T05:13:36.267 回答
1

@Akinakes 的回答非常好。以下是另一种方式的一些提示:

如果你有

input = [['name', '[]', 'NA', '[]'],\
     ['NA', 'loc', 'NA', '[]'],\
     ['NA', '[]', '123', '[]']]

你可以试试

def fil(l):
    tl = filter(lambda x:x not in ('NA','[]'), l)
    if len(tl) == 0:
        tl = [l[-1]]
    t = str(*tl)
    return t

output = map(fil, zip(*input))

输出将是:

['name', 'loc', '123', '[]']
于 2013-09-04T05:37:20.197 回答