2017-04-20 1 views
0

Der Betrieb ist MYSQL Betrieb ähnlich:Wie ersetzt man eine Null-Wert-Zelle durch einen anderen Wert in Python-Datenrahmen?

UPDATE a.tract_201704 SET val_2000=0.91516427*val_2001 WHERE val_2001 IS NOT NULL AND val_2000 IS NULL. 

ich eine df von vielen Spalten aufweisen, in der eine Spalte gibt es genannt val_2000, wenn dies einen Nullwert enthält, dann mit 0,91516427 Ich mag diesen Wert ersetzen * val_2001 (Skalarmultiplikation mit der nächsten Zelle).

-Code bisher: (val_2000 hat entweder 100 oder None)

df = pd.read_csv("singleDataFile_header.csv") 

    df_val2001_null = (df[df['val_2000'] != '100.000000000000']['val_2001']) 
    df_val2000_null = (df[df['val_2000'] != '100.000000000000']['val_2000']) 
    df_val2000_null = 0.91516427*df_val2001_null 

Aber wie diese Werte von df_val2000_null original df zurück zu setzen überall dort, wo keine Werte in df sind [val_2000]?

Antwort

1

können Sie combine_first verwenden:

df = pd.DataFrame({'val_2000':[np.nan,2,3], 
        'val_2001':[4,5,6]}) 

print (df) 
    val_2000 val_2001 
0  NaN   4 
1  2.0   5 
2  3.0   6 

df['val_2000'] = df['val_2000'].combine_first(0.91516427 * df['val_2001']) 
print (df) 
    val_2000 val_2001 
0 3.660657   4 
1 2.000000   5 
2 3.000000   6 

EDIT:

Mögliches Problem ist nan Strings sind, nicht NaN oder in Daten sind einige ungültige Zeichenfolgen.

df = pd.DataFrame({'val_2000':['nan',100,'gggg'], 
        'val_2001':[1,1,1]}) 

print (df) 
    val_2000 val_2001 
0  nan   1 
1  100   1 
2  gggg   1 

df['val_2000'] = pd.to_numeric(df['val_2000'], errors='coerce') 
print (df) 
    val_2000 val_2001 
0  NaN   1 
1  100.0   1 
2  NaN   1 

df['val_2000'] = df['val_2000'].combine_first(0.91516427 * df['val_2001']) 
print (df) 
    val_2000 val_2001 
0 0.915164   1 
1 100.000000   1 
2 0.915164   1 

Wenn nur nan:

df = pd.DataFrame({'val_2000':['nan',100,100], 
        'val_2001':[1,1,1]}) 

print (df) 
    val_2000 val_2001 
0  nan   1 
1  100   1 
2  100   1 

df['val_2000'] = df['val_2000'].astype(float) 
print (df) 
    val_2000 val_2001 
0  NaN   1 
1  100.0   1 
2  100.0   1 
+0

df ['val_2000']. Update (0.91516427 * df ['val_2001']) kann es mit einer where-Klausel aktualisiert werden? – Viv

+0

Es funktioniert nicht, besser ist combinate_first. – jezrael

+0

combine_first bearbeitet val_2000 nur, wenn ein NULL/NONE-Wert vorhanden ist? – Viv

Verwandte Themen