2014-10-08 88 views
0

這裏numpy的唯一方法是一個文本文件的一小部分工作示例:閱讀文本文件,並保留意見

# A B C 
1 7 9 
7 2 10 
10 20 30 

加載該文件使用numpy.loadtxt將放棄註釋行。有沒有一種很好的方式將存儲爲註釋的列映射到可用於訪問的數組中?使用幾行標準python,閱讀,解析,分割和映射到一個數組很容易,但我正在尋找一個內置命令,似乎loadtxtgenfromtxt扔掉所有評論。我有一個暗示,這可能是熊貓的用途,並且使用其他庫進行數據管理的答案也可以。

+1

你是什麼意思「我可以用來訪問的數組」?你想得到什麼結果? – jdehesa 2014-10-08 15:02:53

+0

@javidcf我所擁有的是大量的文本文件,其中最後一行是每一列到描述該列的邏輯名稱的映射。我簡單地想要返回一個'[「A」,「B」,「C」]'的數組,但是可以像'X [「A」] [「C」]'一樣訪問的對象將會是偶數的更好。 – Hooked 2014-10-08 15:07:37

回答

1

確實可以這樣做,首先讀取一行,將列標題提取到列表中,再次讀取它,跳過第一行,傳遞header = None,然後在跳過第一個元素後設置列名:

In [78]: 
import io 
import pandas as pd 
temp="""# A B C 
1 7 9 
7 2 10 
10 20 30""" 

cols = list(pd.read_csv(io.StringIO(temp), sep='\s+', nrows=1)) 
df = pd.read_csv(io.StringIO(temp), sep='\s+', skiprows=1, header=None) 
df.columns = cols[1:] 
df 
Out[78]: 
    A B C 
0 1 7 9 
1 7 2 10 
2 10 20 30 
+0

我把它'io.StringIO'只是爲了處理你在程序中有一個字符串的事實嗎?如果你從磁盤上的文件讀取它,它看起來像你可以傳遞文件名,正確嗎? – Hooked 2014-10-08 15:10:36

+0

@Hooked是的,這是正確的,所以在你的情況下,它會像'df = pd.read_csv('myData.txt',.....)' – EdChum 2014-10-08 15:11:23

3

你是對的熊貓!下面是該文件r.txt(注意我刪除了#):

A B C 
1 7 9 
7 2 10 
10 20 30 

這裏是代碼:

>>> import pandas as pd 
>>> i = pd.read_csv('r.txt', delim_whitespace=True) 
>>> i 
    A B C 
0 1 7 9 
1 7 2 10 
2 10 20 30 

[3 rows x 3 columns] 
>>> i["A"][0] 
1 
+0

如果你刪除'#''genfromtxt'使用第一行標題 - 字段名稱 - 使用'names = True'。 – hpaulj 2014-10-08 15:51:35

3

貌似註釋符不打擾genfromtxt。它仍然可以將第一行作爲名稱的來源,並將數據作爲結構化數組加載。

In [189]: s="""\ 
# A B C 
1 7 9 
7 2 10 
10 20 30 
""" 
In [190]: X=np.genfromtxt(s.splitlines(),names=True) 
In [191]: X 
Out[191]: 
array([(1.0, 7.0, 9.0), (7.0, 2.0, 10.0), (10.0, 20.0, 30.0)], 
     dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8')]) 
In [192]: X.dtype.names 
Out[192]: ('A', 'B', 'C') 
In [193]: X['A'] 
Out[193]: array([ 1., 7., 10.]) 
In [194]: X[1] 
Out[194]: (7.0, 2.0, 10.0)