在python中基于外部列表/数据选择列
我有一个包含各种区域地图变量的数据集(大约1000个)。示例数据如下所示:在python中基于外部列表/数据选择列,python,io,stringio,Python,Io,Stringio,我有一个包含各种区域地图变量的数据集(大约1000个)。示例数据如下所示: Userid regionmap1 regionmap2 regionmap3 and so on. 78 7 na na 45 na na na 67 1 na na Userid regionmap1 regionmap3 7.80000000000000
Userid regionmap1 regionmap2 regionmap3 and so on.
78 7 na na
45 na na na
67 1 na na
Userid regionmap1 regionmap3
7.800000000000000000e+01 7.000000000000000000e+00 nan
4.500000000000000000e+01 nan nan
6.700000000000000000e+01 1.000000000000000000e+00 nan
这里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方面为我提供帮助,那就太好了。这很容易做到。你试过什么 以下是帮助您入门的一般步骤: 1-打开较小的文件,其中包含要保留的regionmaps,并将其重新排列到列表中。 2-打开较大的文件并创建列表字典以包含数据。您可以将dict键基本上看作列标题。值是表示所有记录的列值的列表。 3-现在,从dict中删除KVP,其中密钥不在步骤1的列表中或不是用户ID。 4-使用生成的dict写出新文件
肯定不是唯一的方法,但这是一个简单的方法,你应该能够开始。希望有帮助:)我有一个适合您的问题的解决方案。 您可以执行以下操作以使文件看起来更好
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 regionmap2 regionmap3 and so on.
78 7 na na
45 na na na
67 1 na na
Userid regionmap1 regionmap3
7.800000000000000000e+01 7.000000000000000000e+00 nan
4.500000000000000000e+01 nan nan
6.700000000000000000e+01 1.000000000000000000e+00 nan
试试dis!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
你试过什么吗?你应该提供一个MWEtoo@Trengot我不知道如何进行。我想我们得用字典。如下面的答案所示,可以使用字典。但我想不出字典的价值是什么?谢谢你的详细说明。你能提供字典部分的代码吗?我的意思是如何将值分配为表示所有记录的列值的列表?MyDict['regionmap4']=[2645859339643927]。然后,要获取记录的regionmap4值,可以使用MyDict['regionmap4'][0]。对于第二条记录,使用MyDict['regionmap4'][1],等等。这不是将整个文件读入内存吗?我相信你可以在同一个循环中读写。正如我在问题中指出的。我有大约1000列。因此,在f.write函数中,我不会提供所有1000列。我是Python新手。因此,我们可以传递整个数据集吗?一个1000x1000的表格可以用普通计算机轻松处理。事实上,读和写可以在同一个循环中完成。给定的代码包含执行此操作所需的所有元素。如果需要,我可以添加这样的解决方案。