Eu tenho o seguinte DataFrame de uma consulta SQL:
(Pdb) pp total_rows
ColumnID RespondentCount
0 -1 2
1 3030096843 1
2 3030096845 1
e eu quero rodar assim:
total_data = total_rows.pivot_table(cols=['ColumnID'])
(Pdb) pp total_data
ColumnID -1 3030096843 3030096845
RespondentCount 2 1 1
[1 rows x 3 columns]
total_rows.pivot_table(cols=['ColumnID']).to_dict('records')[0]
{3030096843: 1, 3030096845: 1, -1: 2}
mas quero garantir que as colunas 303 sejam convertidas como cadeias de caracteres em vez de números inteiros, para que eu entenda isso:
{'3030096843': 1, '3030096845': 1, -1: 2}
astype("string")
vez de,astype(str)
por boas razões, dar uma olhada.Respostas:
Uma maneira de converter para string é usar astype :
No entanto, talvez você esteja procurando a
to_json
função, que converterá chaves em json válido (e, portanto, suas chaves em strings):Nota: você pode passar um buffer / arquivo para salvá-lo, além de outras opções ...
fonte
to_json()
provavelmente não chamaastype(str)
, pois deixa datetime64 e suas subclasses em milissegundos desde a época.Se você precisar converter TODAS as colunas em cadeias, basta usar:
Isso é útil se você precisar que tudo, exceto algumas colunas, seja string / objeto, depois volte e converta as outras para o que você precisar (número inteiro neste caso):
fonte
Aqui está o outro, particularmente útil para converter várias colunas em string, em vez de apenas uma coluna:
fonte
Use .astype (str)
Ex:
Seja d o DataFrame do Pandas
d['Column_name'].astype(str)
fonte
pandas> = 1.0: É hora de parar de usar
astype(str)
!Antes do pandas 1.0 (na verdade, 0,25), essa era a maneira mais comum de declarar uma série / coluna como uma string:
Do pandas 1.0 em diante, considere usar o
"string"
tipo .Aqui está o porquê, conforme citado pelos documentos:
Veja também a seção Diferenças comportamentais entre
"string"
eobject
.Os tipos de extensão (introduzidos em 0.24 e formalizados em 1.0) estão mais próximos dos pandas do que do numpy, o que é bom porque os tipos numpy não são poderosos o suficiente. Por exemplo, o NumPy não tem como representar dados ausentes em dados inteiros (desde
type(NaN) == float
). Mas os pandas podem usar colunas Nullable Integer .Por que devo parar de usá-lo?
Mistura acidental de tipos de dados
O primeiro motivo, conforme descrito nos documentos, é que você pode armazenar acidentalmente dados que não são de texto em colunas de objetos.
Desafiando a diferenciação de strings e outros objetos python
Outro exemplo óbvio de exemplo é que é mais difícil distinguir entre "strings" e "objetos". Os objetos são essencialmente do tipo geral para qualquer tipo que não suporte operações vetorizáveis .
Considerar,
Até os pandas 0,25, não havia praticamente nenhuma maneira de distinguir que "A" e "B" não tinham o mesmo tipo de dados.
No pandas 1.0, isso se torna muito mais simples:
Legibilidade
Isso é auto-explicativo ;-)
OK, então devo parar de usá-lo agora?
...Não. No momento em que escrevemos esta resposta (versão 1.1), não há benefícios de desempenho, mas os documentos esperam que aprimoramentos futuros melhorem significativamente o desempenho e reduzam o uso de memória para
"string"
colunas em oposição a objetos. Com isso dito, no entanto, nunca é cedo para formar bons hábitos!fonte
O uso de
.apply()
umalambda
função de conversão também funciona neste caso:total_rows['ColumnID'] = total_rows['ColumnID'].apply(lambda x: str(x))
Para quadros de dados inteiros, você pode usar
.applymap()
. (mas, em qualquer caso, provavelmente.astype()
é mais rápido)fonte