如果读取具有默认列名的文件,如何在之后调用它们?
df[1]
似乎几乎一直都在工作。但是,它在写这样的条件时抱怨类型:
In [60]: cond = ((df[1] != node) & (df[2] != deco))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/ferreirafm/work/colab/SNP/rawdata/<ipython-input-60-513a433bfeb5> in <module>()
----> 1 cond = ((df[1] != node) & (df[2] != deco))
/usr/lib64/python2.7/site-packages/pandas/core/series.pyc in wrapper(self, other)
140 if np.isscalar(res):
141 raise TypeError('Could not compare %s type with Series'
--> 142 % type(other))
143 return Series(na_op(values, other),
144 index=self.index, name=self.name)
TypeError: Could not compare <type 'str'> type with Series
默认情况下,处理数据帧列更适合我的应用程序。
答案 0 :(得分:2)
我在pandas master上,这里读取文件后的默认列名肯定不是0,1,2,..请注意,您可以使用df.icol()按位置选择列。这样,如果已设置列名,或使用默认列名,则不存在依赖关系。
In [93]: data = """\
1,2,3
4,5,6
"""
In [94]: df = pd.read_csv(StringIO(data), header=None)
In [95]: df
Out[95]:
X0 X1 X2
0 1 2 3
1 4 5 6
In [96]: df.icol(0)
Out[96]:
0 1
1 4
Name: X0
答案 1 :(得分:2)
似乎您将一系列标量值与字符串进行比较:
In [73]: node = 'a'
In [74]: deco = 'b'
In [75]: data = [(10, 'a', 1), (11, 'b', 2), (12, 'c', 3)]
In [76]: df = pd.DataFrame(data)
In [77]: df
Out[77]:
0 1 2
0 10 a 1
1 11 b 2
2 12 c 3
In [78]: cond = ((df[1] != node) & (df[2] != deco))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-78-0afad3702859> in <module>()
----> 1 cond = ((df[1] != node) & (df[2] != deco))
/home/.../python2.7/site-packages/pandas/core/series.pyc in wrapper(self, other)
140 if np.isscalar(res):
141 raise TypeError('Could not compare %s type with Series'
--> 142 % type(other))
143 return Series(na_op(values, other),
144 index=self.index, name=self.name)
TypeError: Could not compare <type 'str'> type with Series
请注意,pandas可以处理一系列中的字符串和数字,但是比较字符串和数字并不是很有意义,因此错误消息很有用。 但是,大熊猫应该提供更详细的错误消息。
如果您对第2列的条件是一个数字,它将起作用:
In [79]: deco = 3
In [80]: cond = ((df[1] != node) & (df[2] != deco))
In [81]: df[cond]
Out[81]:
0 1 2
1 11 b 2
一些意见:
也许你的一些困惑是由于熊猫的设计决定:
如果您使用read_csv
从文件中读取数据,结果数据框的默认列名称将设置为X.1
至X.N
(以及X1
至{{ 1}}对于版本&gt; = 0.9),这是字符串。
如果您从退出数组或列表或某些内容创建数据框,则列名称默认为XN
到0
并且是整数。
N
我打开了ticket进行讨论。
所以你的
In [23]: df = pd.read_csv(StringIO(data), header=None)
In [24]: df.columns
Out[24]: Index([X.1, X.2, X.3], dtype=object)
In [25]: df.columns[0]
Out[25]: 'X.1'
In [26]: type(df.columns[0])
Out[26]: str
In [27]: df = pd.DataFrame(randn(2,3))
In [30]: df.columns
Out[30]: Int64Index([0, 1, 2])
In [31]: df.columns[0]
Out[31]: 0
In [32]: type(df.columns[0])
Out[32]: numpy.int64
如果In [60]: cond = ((df[1] != node) & (df[2] != deco))
和df[1]
的类型与df[2]
和node
的类型相同,则应适用于从数组或其他内容创建的数据框。< / p>
如果您已阅读deco
而不是
read_csv
应该适用于版本&lt; 0.9,虽然它应该是
In [60]: cond = ((df['X.2'] != node) & (df['X.3'] != deco))
版本&gt; = 0.9。