2017-03-02 3 views
1

Von einer anfänglichen Datenrahmen aus einer Datei csv geladen,auf gefilterten Pandas Erstellen von Spaltendatenrahmen

df = pd.read_csv("file.csv",sep=";") 

ich eine gefilterte Kopie mit

df_filtered = df[df["filter_col_name"]== value] 

, aber wenn Sie eine neue Spalte Erstellung der diff() Methode ,

df_filtered["diff"] = df_filtered["feature"].diff() 

Ich bekomme die folgende Warnung:

/usr/local/bin/ipython3:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    #!/usr/bin/python3 

Ich merke auch, dass die Verarbeitungszeit sehr lang ist.

Überraschenderweise (zumindest für mich ...), wenn ich das gleiche auf dem nicht gefilterten DataFrame mache, läuft ich gut.

Wie soll ich fortfahren, um eine "diff" -Spalte für die gefilterten Daten zu erstellen?

Antwort

1

Sie benötigen copy:

Wenn Sie Werte in df_filtered ändern später werden Sie feststellen, dass die Änderungen propagieren nicht wieder auf die ursprünglichen Daten (df), und dass Pandas nicht warnen.

#need process sliced df, return sliced df 
df_filtered = df[df["filter_col_name"]== value].copy() 

Oder:

#need process sliced df, return all df 
df.loc[df["filter_col_name"]== value, 'feature'] = 
df.loc[df["filter_col_name"]== value , 'feature'].diff() 

Probe:

df = pd.DataFrame({'filter_col_name':[1,1,3], 
        'feature':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,3,5], 
        'E':[5,3,6], 
        'F':[7,4,3]}) 

print (df) 
    C D E F feature filter_col_name 
0 7 1 5 7  4    1 
1 8 3 3 4  5    1 
2 9 5 6 3  6    3 
value = 1 

df_filtered = df[df["filter_col_name"]== value].copy() 
df_filtered["diff"] = df_filtered["feature"].diff() 
print (df_filtered) 
    C D E F feature filter_col_name diff 
0 7 1 5 7  4    1 NaN 
1 8 3 3 4  5    1 1.0 

value = 1 

df.loc[df["filter_col_name"]== value, 'feature'] = 
df.loc[df["filter_col_name"]== value , 'feature'].diff() 

print (df) 
    C D E F feature filter_col_name 
0 7 1 5 7  NaN    1 
1 8 3 3 4  1.0    1 
2 9 5 6 3  6.0    3 
0

Try u singen

df_filtered.loc[:, "diff"] = df_filtered["feature"].diff() 
Verwandte Themen