2014-10-08 84 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)