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?

Simon Righley
fonte
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)
Do utilizador
fonte
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
shubhamgoel27
fonte
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.

Gareth Latty
fonte
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
Jeff
fonte
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
Bruno Benevides
fonte
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')
jezrael
fonte