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?
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:
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 data0120TrueFalseTrue1FalseFalseTrue[3]:print data*101201011001
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]: dfOut[105]:
A B0TrueFalse1TrueFalse2TrueFalseIn[106]: df.dtypesOut[106]:
A bool
B bool
dtype: objectIn[107]: df.astype(int)Out[107]:
A B010110210In[108]: df.astype(int).dtypesOut[108]:
A int64
B int64
dtype: object
Respostas:
Uma maneira sucinta de converter uma única coluna de valores booleanos em uma coluna de números inteiros 1 ou 0:
fonte
somecolumn
. O usoastype(int)
falhará. Outra abordagem, que se converteTrue
em 1.0 eFalse
0.0 (flutuantes), preservando os valores de NaN, é:df.somecolumn = df.somecolumn.replace({True: 1, False: 0})
astype(float)
e obter o mesmo resultado?Apenas multiplique seu Dataframe por 1 (int)
fonte
True
está1
em Python e da mesma formaFalse
é0
* :Você deve poder executar quaisquer operações que desejar, tratando-as como se fossem números, pois são números:
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 -True
não será o mesmo objeto que qualquer aleatório1
.fonte
np.sin(True).dtype
é float16 para mim.df.my_column.mean()
muito bem (como você sugere), mas quando tento:df.groupby("some_other_column").agg({"my_column":"mean"})
receboDataError: No numeric types to aggregate
, então parece que eles NÃO são sempre os mesmos. Apenas para sua informação.bool
colunas perfeitamente.TypeError: numpy boolean subtract, the
-` operator, está obsoleto, use a função bitwise_xor,^
operator ou a logic_xor .bool
colunas como faz paraint
colunasVocê também pode fazer isso diretamente no Frames
fonte
Você pode usar uma transformação para seu quadro de dados:
transformando Verdadeiro / Falso em 1/0
fonte
Use
Series.view
para converter booleano em números inteiros:fonte