【问题标题】:Selecting columns based on external list/data in python根据python中的外部列表/数据选择列
【发布时间】:2014-10-20 18:05:27
【问题描述】:

我有一个包含各种区域地图变量的数据集(大约 1000 个)。示例数据如下所示:

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.

所以我的任务是仅将这些区域图变量作为列保留在原始文件中,并删除所有其他 990 列。所以最终的数据应该是这样的:

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

如果有人能在 Python 中为我提供这方面的帮助,那就太好了。

【问题讨论】:

  • 你有没有尝试过?
  • 你也应该提供 MWE
  • @Trengot 我不知道如何继续。我认为我们必须使用字典。正如以下答案所示,可以使用字典。但无法弄清楚字典的值是什么?

标签: python io stringio


【解决方案1】:

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

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

绝对不是唯一的方法,但它是一种简单的方法,您应该可以开始使用。希望有帮助:)

【讨论】:

  • 感谢您的详细说明。你能提供字典部分的代码吗?我的意思是我们如何将值分配为代表所有记录的列值的列表?
  • MyDict['regionmap4'] = [2645, 8593, 3964, 3927]。然后,要获取记录的 regionmap4 值,您可以使用 MyDict['regionmap4'][0]。对于第二条记录,使用 MyDict['regionmap4'][1] 等。
【解决方案2】:

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

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

【讨论】:

  • 这不是将整个文件读入内存吗?我相信你可以在同一个循环中进行读取和写入。
  • 正如我在问题中指出的那样。我有大约 1000 列。所以在 f.write 函数中,我不会提供所有 1000 列。我是 Python 新手。那么我们可以传递整个数据集吗?
  • 一张 1000x1000 的表格可以用普通电脑轻松处理。实际上,读取和写入可以在同一个循环中完成。给定的代码包含执行此操作所需的所有元素。如果需要,我可以添加这样的解决方案。
【解决方案3】:

试试看! 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多