Python
使用 iloc 設置值
combined
此行返回數據框中的前 4 行feature_a
combined.iloc[0:4]["feature_a"]
正如預期的那樣,下一行返回 column 數據框中的第 2、第 4 和第 16 行
feature_a
:combined.iloc[[1,3,15]]["feature_a"]
此行將數據框中的前 4 行設置為
feature_a
to77
。combined.iloc[0:4]["feature_a"] = 77
這條線做了一些事情。某種計算正在發生,因為當應用於更長的列表時需要更長的時間。
combined.iloc[[1,3,15]]["feature_a"] = 88
使用以下選項檢查時,第 2、第 4 和第 16 行未設置為
88
:combined.iloc[[1,3,15]]["feature_a"]
如何在不走大量編碼彎路的情況下將數據幀列的任意行列表設置為一個值?
這種情況似乎應該非常簡單和常見。
如果您反轉選擇器,並首先按列選擇,它將正常工作:
代碼:
df.feature_a.iloc[[1, 3, 15]] = 88
為什麼?
當您執行第一種(非工作方式)時,您正在選擇數據框的非連續部分。您應該已經收到警告:
試圖在 DataFrame 中的切片副本上設置一個值。嘗試改用 .loc[row_indexer,col_indexer] = value
請參閱文檔中的注意事項:http: //pandas.pydata.org/pandas- > docs/stable/indexing.html#indexing-view-versus-copy
這是因為發生了兩個獨立的操作。
combined.iloc[[1,3,15]]
創建一個只有三行的新數據框,並且必須複製該框架。然後…- 通過選擇一列,
["feature_a"]
但它是針對副本選擇的。所以任務轉到副本。有多種方法可以解決此問題,但在這種情況下,先選擇列,然後選擇部分列進行分配更容易(也更便宜)。
測試代碼:
df = pd.DataFrame(np.zeros((20, 3)), columns=['feature_a', 'b', 'c']) df.feature_a.iloc[[1, 3, 15]] = 88 print(df)
結果:
feature_a b c 0 0.0 0.0 0.0 1 88.0 0.0 0.0 2 0.0 0.0 0.0 3 88.0 0.0 0.0 4 0.0 0.0 0.0 5 0.0 0.0 0.0 6 0.0 0.0 0.0 7 0.0 0.0 0.0 8 0.0 0.0 0.0 9 0.0 0.0 0.0 10 0.0 0.0 0.0 11 0.0 0.0 0.0 12 0.0 0.0 0.0 13 0.0 0.0 0.0 14 0.0 0.0 0.0 15 88.0 0.0 0.0 16 0.0 0.0 0.0 17 0.0 0.0 0.0 18 0.0 0.0 0.0 19 0.0 0.0 0.0