Quiero convertir el tipo de columna a int usando pandas. Aquí está el código fuente:

# CustomerID is missing on several rows. Drop these rows and encode customer IDs as Integers.
cleaned_data = retail_data.loc[pd.isnull(retail_data.CustomerID) == False]
cleaned_data['CustomerID'] = cleaned_data.CustomerID.astype(int)

Esto genera la siguiente advertencia:

SettingWithCopyWarning: se está intentando establecer un valor en una copia de un segmento de un DataFrame

¿Cómo puedo evitar esta advertencia? ¿Existe una mejor manera de convertir el tipo de CustomerID a int? Estoy en Python 3.5.

3
Dimitris Poulopoulos 10 dic. 2016 a las 16:55
1
 – 
unutbu
10 dic. 2016 a las 17:56

1 respuesta

La mejor respuesta

Úselo en uno loc:

retail_data.loc[~retail_data.CustomerID.isnull(),'CustomerID'] = retail_data.loc[~retail_data.CustomerID.isnull(),'CustomerID'].astype(int)

Ejemplo:

import pandas as pd
import numpy as np

retail_data = pd.DataFrame(np.random.rand(4,1)*10, columns=['CustomerID'])
retail_data.iloc[2,0] = np.nan
print(retail_data)

   CustomerID
0    9.872067
1    5.645863
2         NaN
3    9.008643

retail_data.loc[~retail_data.CustomerID.isnull(),'CustomerID'] = retail_data.loc[~retail_data.CustomerID.isnull(),'CustomerID'].astype(int)

       CustomerID
0         9.0
1         5.0
2         NaN
3         9.0

Observará que el tipo d de la columna sigue siendo flotante, porque np.nan no se puede codificar en una columna int.

Si realmente desea eliminar estas filas sin cambiar el retail_data subyacente, cree un copy() real:

cleaned_data = retail_data.loc[~retail_data.CustomerID.isnull()].copy()
3
Julien Marrec 10 dic. 2016 a las 17:12