2014-10-30 51 views
2

我有一個非常簡單的問題。我想改變熊貓數據框的給定行的給定列中的值。我嘗試這樣做以下列方式:如何修改一個熊貓數據框的「單元格」中的值?

df['column3'].loc[this_date] = val 

結果我得到以下警告:

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 

我這個警告的解釋是,通過使用列名('column3')和loc我不能真正訪問(參考)數據幀的所需單元。相反,我創建了一個對象,它是「單元」對象的副本,然後嘗試更改與此「複製對象」關聯的值。

我不明白的是,它似乎工作。儘管熊貓寫道我試圖修改副本,但我修改了原始數據框。

我的問題是如何確保我真的在做我想做的事情,以及如何以「正確」的方式做到這一點,以便熊貓不會抱怨?

+1

它不應該是'df.loc [this_date,「欄3」] = VAL:否則,您可以通過pd.set_option('mode.chained_assignment', None)

你的設定值的方式是好的,具有以下的放在一起抑制警告'?您的版本與文檔不同:http://pandas.pydata.org/pandas-docs/stable/indexing.html – EdChum 2014-10-30 16:14:23

+1

它的工作原理是偶然的,它可能不起作用,這就是爲什麼您會收到警告,請嘗試我的以前的評論,應該沒有警告 – EdChum 2014-10-30 16:26:14

回答

1

獲取警告的原因是df本身是其他一些數據框對象的副本。我想你有一些原始數據幀df_origin。通過切片等操作,您可以從df_origin獲得df。所以dfdf_origin的副本。然後,您嘗試設置一些值爲df,警告提出告訴您,這不會更改df_origin中的值。 一個解決方案是如果您不關心df_origin,則在切片前後使用單個變量指向數據幀對象。

df.ix[this_date, 'column3] = val 
df.loc[this_date, 'column3'] = val 
df.at[this_date, 'column3'] = val 
+0

警告顯示,因爲鏈接索引不好!它取決於底層數據(是否是視圖)以及是否混合了dtype。如果這些都是條件,那麼你將設置一個副本,因此警告。不做鏈式索引EVER的原因是不能保證你的設置可以工作!還有許多其他索引選項可用。 – Jeff 2014-11-01 00:59:14

相關問題