Tengo el siguiente DataFrame de una consulta SQL:
(Pdb) pp total_rows
ColumnID RespondentCount
0 -1 2
1 3030096843 1
2 3030096845 1
y quiero pivotarlo así:
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}
pero quiero asegurarme de que las 303 columnas se conviertan en cadenas en lugar de enteros para que obtenga esto:
{'3030096843': 1, '3030096845': 1, -1: 2}
astype("string")
lugar deastype(str)
por muy buenas razones, eche un vistazo.Respuestas:
Una forma de convertir a cadena es usar un tipo :
Sin embargo, quizás esté buscando la
to_json
función, que convertirá las claves en json válidas (y, por lo tanto, sus claves en cadenas):Nota: puede pasar un búfer / archivo para guardar esto, junto con algunas otras opciones ...
fuente
to_json()
probablemente no llameastype(str)
ya que deja datetime64 y sus subclases en milisegundos desde la época.Si necesita convertir TODAS las columnas en cadenas, simplemente puede usar:
Esto es útil si necesita todo excepto algunas columnas para ser cadenas / objetos, luego regrese y convierta las otras a lo que necesite (entero en este caso):
fuente
Aquí está el otro, particularmente útil para convertir las múltiples columnas en cadenas en lugar de solo una columna:
fuente
Utilice .astype (str)
Ex:
Let d be the Pandas DataFrame
d['Column_name'].astype(str)
fuente
pandas> = 1.0: ¡ Es hora de dejar de usar
astype(str)
!Antes de los pandas 1.0 (bueno, 0.25 en realidad) esta era la forma de facto de declarar una Serie / columna como una cadena:
Desde pandas 1.0 en adelante, considere usar el
"string"
tipo en su lugar.He aquí por qué, como lo citan los documentos:
Consulte también la sección sobre Diferencias de comportamiento entre
"string"
yobject
.Los tipos de extensión (introducidos en 0.24 y formalizados en 1.0) están más cerca de los pandas que numpy, lo cual es bueno porque los tipos de numpy no son lo suficientemente potentes. Por ejemplo, NumPy no tiene ninguna forma de representar datos faltantes en datos enteros (desde
type(NaN) == float
). Pero los pandas pueden usar columnas de enteros anulables .¿Por qué debería dejar de usarlo?
Mezcla accidental de dtypes
La primera razón, como se describe en los documentos, es que puede almacenar accidentalmente datos que no son de texto en columnas de objetos.
Desafiando diferenciar cadenas y otros objetos de python
Otro ejemplo de ejemplo obvio es que es más difícil distinguir entre "cadenas" y "objetos". Los objetos son esencialmente el tipo de cobertura para cualquier tipo que no admite operaciones vectorizables .
Considerar,
Hasta los pandas 0.25, prácticamente no había forma de distinguir que "A" y "B" no tienen el mismo tipo de datos.
De pandas 1.0, esto se vuelve mucho más simple:
Legibilidad
Esto se explica por sí mismo ;-)
OK, ¿debería dejar de usarlo ahora?
...No. Al momento de escribir esta respuesta (versión 1.1), no hay beneficios de rendimiento, pero los documentos esperan que las mejoras futuras mejoren significativamente el rendimiento y reduzcan el uso de memoria para las
"string"
columnas en lugar de los objetos. Dicho esto, sin embargo, ¡nunca es demasiado temprano para formar buenos hábitos!fuente
Usar
.apply()
con unalambda
función de conversión también funciona en este caso:total_rows['ColumnID'] = total_rows['ColumnID'].apply(lambda x: str(x))
Para marcos de datos completos que puede usar
.applymap()
. (pero en cualquier caso probablemente.astype()
sea más rápido)fuente