Pandas DataFrameでTrue / Falseを1/0にマッピングするにはどうすればよいですか?


133

ブール値のTrue / False値を持つpython pandas DataFrameに列がありますが、それ以上の計算には1/0表現が必要です。それを行う簡単なパンダ/派手な方法はありますか?


1
さらにどのような計算が必要ですか?
Jon Clements

@JonClementsをオウムするために、計算で使用するためにboolをintに変換する必要があるのはなぜですか?boolは算術で直接機能します(内部的にはintであるため)。
cs95

回答:


276

ブール値の単一の列を整数1または0の列に変換する簡単な方法:

df["somecolumn"] = df["somecolumn"].astype(int)

4
コーナーケースは、にNaN値がある場合ですsomecolumn。使用astype(int)すると失敗します。変換別のアプローチ、True1.0およびFalseNaNの値を維持しながら、0.0(フロート)には、行うことです:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
DustByte

@DustByteグッドキャッチ!
Homunculus Reticulli

@DustByte使用astype(float)しても同じ結果が得られませんか?
AMC

65

データフレームに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

このソリューションの利点は何ですか?
AMC

44

Trueある1Pythonで、同様Falseです0*

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

あなたは、彼らのように、彼らは、数字であるかのようにちょうどそれらを処理することにより、あなたがそれらにしたい任意の操作を実行できるようにする必要があります番号:

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

だからあなたの質問に答えるために、仕事は必要ありません-あなたはあなたが探しているものをすでに持っています。

*注Iの使用である英語の単語ではなく、Pythonのキーワードとしてis- True任意のランダムと同じオブジェクトではありません1


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

9
私はブール列のデータフレームを持っていて、df.my_column.mean()(ほのめかして)うまく呼び出すことができますが、試してみると、がdf.groupby("some_other_column").agg({"my_column":"mean"})得られるためDataError: No numeric types to aggregate、常に同じではないようです。参考までに。
dwanderson

Pandasバージョン24(および以前のバージョン)では、bool列を問題なく集計できます。
BallpointBen

1
numpyもブール型のエラーをスローするようです:TypeError: numpy boolean subtract, the -`演算子、非推奨です。代わりにbitwise_xor、^演算子、またはlogical_xor関数を使用してください。`@Userの回答を使用すると、これが修正されます。
Amadou Kone

それは同じではないもう一つの理由:df.col1 + df.col2 + df.col3は動作しませんbool、それはの場合と同様に、列intの列
colorlace

22

フレームで直接行うこともできます

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.