2014-08-27 101 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