2013-06-29 11 views
44

私はpython pandas DataFrameにTrue/False値を持つカラムを持っていますが、それ以上の計算には1/0表現が必要です。それをするために素早くパンダ/ナンピーの方法がありますか?python pandas/numpy 1/0マッピングにTrue/False

EDIT: numpyの場合、整数とTrue/Falseの両方の値を持つ配列を指定すると、そのような配列にdtype=objectが返されます。 numpyでさらに計算を進めるために、私は明示的にnp_values = np.array(df.values, dtype = np.float64)に設定しなければなりませんでした。

+0

これ以上計算する必要はありますか? –

答えて

22

TrueはPythonで1あり、同様にFalse0*です:

>>> True == 1 
True 
>>> False == 0 
True 

あなたは、彼らが数字であるかのようにちょうどそれらを処理することにより、それらのあなたが望む任意の操作を実行できるようにする必要があり、彼らのように - あなたはすでに時間

>>> issubclass(bool, int) 
True 
>>> True * 5 
5 

だからあなたの質問、必要な作業なしに答えるために:数字ですあなたは何を探しているのですか? True任意のランダム1と同じオブジェクトではありません -

*私はを使用しますがないPythonのキーワードisは、英語の単語としてです。

+0

偉大な、それについて知らなかった、ありがとう! –

+0

浮動小数点演算を行う場合、データ型に注意してください。 'np.sin(True).dtype'は私にとってはfloat16です。 – jorgeca

+1

ブール型の列を持つデータフレームがあり、 'df.my_column.mean()'をうまく呼び出すことができますが、 'df.groupby(" some_other_column ")。agg( {"my_column": "mean"}) 'DataError:集計する数値型はありません。 'ので、常に同じではありません。ちょうどFYI。 – dwanderson

14

また、ただ非常に明示的に整数1または0の列にブール値の単一列を変換する方法の質問に答えるためにフレーム

In [104]: df = DataFrame(dict(A = True, B = False),index=range(3)) 

In [105]: df 
Out[105]: 
     A  B 
0 True False 
1 True False 
2 True False 

In [106]: df.dtypes 
Out[106]: 
A bool 
B bool 
dtype: object 

In [107]: df.astype(int) 
Out[107]: 
    A B 
0 1 0 
1 1 0 
2 1 0 

In [108]: df.astype(int).dtypes 
Out[108]: 
A int64 
B int64 
dtype: object 
103

上で直接これを行うことができますdf.somecolumn = df.somecolumn.astype(int)

18

わずか1(int型)によって、あなたのデータフレームを掛け

[1]: data = pd.DataFrame([[True, False, True], [False, False, True]]) 
[2]: print data 
      0  1  2 
    0 True False True 
    1 False False True 

[3]: print data*1 
     0 1 2 
    0 1 0 1 
    1 0 0 1 
関連する問題