一連のスカラー値を文字列と比較しているようです:
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
to X.N
(バージョン >= 0.9 の場合は to) に設定されます。これは文字列です X1
。XN
既存の配列やリストなどからデータ フレームを作成する場合、列名はデフォルトで整数0
になります。N
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
deco
read_csv
よりも ファイルを読み取った場合
In [60]: cond = ((df['X.2'] != node) & (df['X.3'] != deco))
バージョン < 0.9 で動作するはずですが、
In [60]: cond = ((df['X2'] != node) & (df['X3'] != deco))
バージョン>= 0.9。