Como posso mapear True / False para 1/0 em um DataFrame do Pandas?


133

Eu tenho uma coluna no python pandas DataFrame que possui valores booleanos True / False, mas para cálculos adicionais eu preciso de representação 1/0. Existe uma maneira rápida de fazer isso?


1
Que cálculos adicionais são necessários?
Jon Clements

Para papagaio @JonClements, por que você precisa converter bool para int para usar no cálculo? O bool trabalha diretamente com aritmética (uma vez que é internamente um int).
cs95 14/07

Respostas:


276

Uma maneira sucinta de converter uma única coluna de valores booleanos em uma coluna de números inteiros 1 ou 0:

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

4
O caso de canto é se houver valores de NaN em somecolumn. O uso astype(int)falhará. Outra abordagem, que se converte Trueem 1.0 e False0.0 (flutuantes), preservando os valores de NaN, é:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
DustByte

@DustByte Good catch!
Homunculus Reticulli

@DustByte Você não poderia simplesmente usar astype(float)e obter o mesmo resultado?
AMC

65

Apenas multiplique seu Dataframe por 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

Quais são as vantagens desta solução?
AMC

44

Trueestá 1em Python e da mesma forma Falseé 0* :

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

Você deve poder executar quaisquer operações que desejar, tratando-as como se fossem números, pois são números:

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

Portanto, para responder à sua pergunta, não é necessário trabalho - você já tem o que está procurando.

* Nota que eu uso é como uma palavra em inglês, não a palavra is- chave Python - Truenão será o mesmo objeto que qualquer aleatório 1.


1
Apenas tenha cuidado com os tipos de dados se estiver fazendo matemática de ponto flutuante: np.sin(True).dtypeé float16 para mim.
jorgeca

9
Eu tenho um dataframe com uma coluna booleana e posso chamar df.my_column.mean()muito bem (como você sugere), mas quando tento: df.groupby("some_other_column").agg({"my_column":"mean"})recebo DataError: No numeric types to aggregate, então parece que eles NÃO são sempre os mesmos. Apenas para sua informação.
dwanderson

Na versão 24 do pandas (e talvez antes), você pode agregar boolcolunas perfeitamente.
precisa

1
Parece que o numpy também gera erros com os tipos booleanos: TypeError: numpy boolean subtract, the -` operator, está obsoleto, use a função bitwise_xor, ^operator ou a logic_xor .
Amadou Kone

Outra razão que não é o mesmo: df.col1 + df.col2 + df.col3 não funciona para boolcolunas como faz para intcolunas
colorlace

22

Você também pode fazer isso diretamente no Frames

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

2

Você pode usar uma transformação para seu quadro de dados:

df = pd.DataFrame(my_data condition)

transformando Verdadeiro / Falso em 1/0

df = df*1

Isso é idêntico a esta solução , publicada 3 anos antes.
AMC

1

Use Series.viewpara converter booleano em números inteiros:

df["somecolumn"] = df["somecolumn"].view('i1')
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.