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.