2016-12-10 2 views
1

Ich möchte den Typ einer Spalte mit Pandas zu int konvertieren. Hier ist der Quellcode:Wie kann ich SettingWithCopyWarning in Pandas vermeiden?

# 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) 

Dies wirft die Warnung unter:

SettingWithCopyWarning: Ein Wert wird versucht, auf einer Kopie eines Scheibe aus einem Datenrahmen

eingestellt werden Wie Kann ich diese Warnung vermeiden? Gibt es eine bessere Möglichkeit, den Typ von CustomerID zu Int zu konvertieren? Ich bin auf Python 3.5.

+1

Mögliche doppelte: http://stackoverflow.com/q/38809796/190597 – unutbu

Antwort

2

Verwenden Sie es in einem loc:

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

Beispiel:

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 

Sie werden bemerken, dass die dtype der Säule noch schweben, weil die np.nan kann nicht in einer int Spalte codiert sein.

Wenn Sie wirklich diese Zeilen löschen möchten, ohne die zugrunde liegende retail_data zu ändern, stellen eine tatsächliche copy():

cleaned_data = retail_data.loc[~retail_data.CustomerID.isnull()].copy() 
Verwandte Themen