2017-04-20 81 views
0

的操作類似於MYSQL操作:如何用python數據框中的其他值替換空值單元格?

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

我有很多列的DF,其中有一個名爲列val_2000,如果包含空值,那麼我想0.91516427替換該值* val_2001(與下一個單元格的標量相乘)。

到目前爲止的代碼:(val_2000有100或無)

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 

但如何只要有在DF [val_2000]是無值把這個值從df_val2000_null回到原來的DF?

回答

1

您可以使用combine_first

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 

編輯:

可能的問題是nan是字符串,而不是NaN或數據是一些無效的字符串。

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 

如果只有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'])是否可以使用where子句進行更新? – Viv

+0

它不工作,更好的是combine_first。 – jezrael

+0

combine_first只有在存在NULL/NONE值時纔會編輯val_2000嗎? – Viv

相關問題