以下是文本文件的最小工作示例:
# A B C
1 7 9
7 2 10
10 20 30
使用numpy.loadtxt
加载此文件将丢弃注释行。有没有一种很好的方法可以将存储为注释的列映射到可用于访问的数组中?使用几行标准python,读取,解析,拆分和映射到数组很容易做到这一点,但我正在寻找一个内置命令,似乎loadtxt
和{{1抛弃所有评论。我有一个想法,这可能是熊猫的用途,并且使用另一个库进行数据管理的答案也可以。
答案 0 :(得分: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
答案 1 :(得分: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)
答案 2 :(得分: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