2014-08-27 96 views
0

我有一个数据集与各种地区地图变量(约1000)。示例数据如下所示:基于Python中的外部列表/数据选择列

Userid regionmap1 regionmap2 regionmap3  and so on. 
78  7   na   na 
45  na   na   na 
67  1   na   na 

此处regionmap变量中的数字表示视图的数量。现在我有一个只有10个区域映射条目的外部文件。该文件包含10个不同地区的地图变量10个条目/行:

Regionmap1 
Regionmap3 
Regionmap7 
..... 
..... 
Regionmap856. 

所以,我的任务是保持只有这些regionmap变量列在原来的文件,并删除所有其他990列。因此,最终数据应该是这样的:

Userid Regionmap1 regionmap3 regionmap7 ........ regionmap856 
78  7   na   na      na 
45  na   na   na      na 
67  1   na   na      na 

这将是巨大的,如果任何人都可以提供我在这方面在Python帮助。

+0

您尝试过任何操作吗? – Holloway 2014-08-27 08:28:40

+0

你也应该提供MWE – Germano 2014-08-27 08:34:57

+0

@Trengot我不确定如何继续。我认为我们必须使用字典。正如下面的答案所表明的那样,可以使用字典。但无法弄清楚字典的价值是什么? – user2007506 2014-08-27 09:35:16

回答

0

这很容易做到。你有什么尝试?

以下是帮助您入门的一般步骤: 1 - 打开您要保留的区域图的较小文件并将它们读入列表中。 2 - 打开较大的文件并创建一个包含数据的列表字典。您可以将字典的键视为基本列标题。这些值是代表所有记录的列值的列表。 3 - 现在,从字典中删除kvps,其中密钥不在步骤1中的列表中,或者不是用户标识。 4 - 使用生成的字典来写出一个新文件。

绝对不是唯一的方法,但它是一个简单的,你应该能够开始。希望帮助:)

+0

感谢您的详细说明。你能提供字典部分的代码吗?我的意思是我们如何将值分配为表示所有记录的列值的列表? – user2007506 2014-08-27 09:45:19

+0

MyDict ['regionmap4'] = [2645,8593,3964,3927]。然后,要获得记录的regionmap4值,可以使用MyDict ['regionmap4'] [0]。对于第二条记录,请使用MyDict ['regionmap4'] [1]等。 – 2014-08-27 19:12:33

0

我有适合您的问题的解决方案。 您可以执行以使文件看起来更好。

import StringIO 
import numpy as np 

# Preparing an object that simulates a file (f is the file) 
f = StringIO.StringIO() 
f.write("""Userid regionmap1 regionmap2 regionmap3 
    78  7   na   na 
    45  na   na   na 
    67  1   na   na""") 
f.seek(0) 

# Reading file and getting the header (1st line) 
head = f.readline().strip("\n").split() 
data = [] 
for a in f: 
    data.append([float(e) for e in a.replace('na', 'NaN').split()]) 
# 
data = np.array(data) 

# Columns to keep 
s = ("Regionmap1", "Regionmap3") 
s = map(lambda e: e.lower(), s) 
s = ["Userid",] + s 

# Index of the columns to keep 
idx, = np.where([e in s for e in head]) 

# Saving the new data in a file (simulated with StringIO) 
ff = StringIO.StringIO() 
ff.write(' '.join(tuple(s)) + '\n') 
np.savetxt(ff, data[:, idx]) 

渲染的文件看起来像:

Userid regionmap1 regionmap3 
7.800000000000000000e+01 7.000000000000000000e+00 nan 
4.500000000000000000e+01 nan nan 
6.700000000000000000e+01 1.000000000000000000e+00 nan 
+0

这不会将整个文件读入内存吗?我相信你可以在同一个循环中进行读写操作。 – Holloway 2014-08-27 09:56:38

+0

正如我在我的问题中指出的那样。我有大约1000列。所以在f.write函数中,我不会提供所有1000列。我是Python的新手。那么我们可以传递整个数据集吗? – user2007506 2014-08-27 10:03:44

+0

1000x1000的桌子可以用普通电脑轻松处理。事实上,阅读和写作可以在同一个循环中完成。 给定的代码包含所需的所有元素。 如果需要,我可以添加这样的解决方案。 – Taha 2014-08-27 11:16:04

0

尝试解散! Dis代码是将字典以标题作为关键字并将列值列表作为值形成

f = open('2.txt', 'r') #opening the large file 
    data = f.readlines() 
    f.close() 

    hdrs = data[0].split('\t') #assuming that large file is tab separated, and the first line is header line 
    data_dict = {} #main data 
    for each_line in data[1:]: #starting from second line as the first line is header line 
     splitdata = each_line.split('\t') #splitting the line with tab 
     for i, d in enumerate(splitdata): 
      tmpval = data_dict.get(hdrs[i], []) 
      tmpval.append(d) 
      data_dict[hdrs[i]] = tmpval  #appending the column value for its respective header 

    for k, v in data_dict.items(): #printing the final data dict 
     print k, v