[英]Change Series inplace in DataFrame after applying function on it
我正在嘗試使用pandas
來使用簡單的函數就地更改我的一列。
閱讀整個 Dataframe 后,我嘗試在一個系列上應用函數:
wanted_data.age.apply(lambda x: x+1)
而且效果很好。 當我嘗試將它放回我的 DataFrame 時,會出現唯一的問題:
wanted_data.age = wanted_data.age.apply(lambda x: x+1)
或者:
wanted_data['age'] = wanted_data.age.apply(lambda x: x+1)
拋出以下警告:
> C:\Anaconda\lib\site-packages\pandas\core\generic.py:1974:
> 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 the caveats in the documentation:
> http://pandas.pydata.org/pandas-docs/stable
> /indexing.html#indexing-view-versus-copy self[name] = value
當然,我可以使用以下長格式設置 DataFrame:
wanted_data.loc[:, 'age'] = wanted_data.age.apply(lambda x: x+1)
但是有沒有其他更簡單、更語法更好的方法來做到這一點?
謝謝!
使用loc
:
wanted_data.loc[:, 'age'] = wanted_data.age.apply(lambda x: x + 1)
我建議wanted_data['age']= wanted_data['age'].apply(lambda x: x+1)
,然后將文件保存為wanted_data.to_csv(fname,index=False)
,其中“fname”是要更新的文件。
我無法發表評論,所以我將把它作為答案。
由於鏈式索引在內部打包的方式,您可能會得到一個深層副本,而不是對初始 DataFrame 的引用(有關更多信息,請參閱鏈式分配 -這是一個非常好的來源。裸 .loc[] 總是返回一個引用) . 因此,您可能不會分配回您的 DataFrame,而是分配給它的副本。 另一方面,您的格式可能會返回對初始 Dataframe 的引用,並且在對其進行變異時,初始 DataFrame 也會發生變異。 Python 打印此警告以應對這種情況,以便用戶可以決定這是否是想要的處理方式。
如果您知道自己在做什么,可以使用以下命令使警告靜音:
with pd.options.mode.chained_assignment = "None":
wanted_data.age = wanted_data.age.apply(lambda x: x+1)
如果您認為這是一種重要的方式(例如,有可能無意中改變了初始 DataFrame),您可以將上述選項設置為“raise”,這樣就會引發錯誤,而不是警告。
另外,我認為“就地”一詞的用法並不完全正確。 “就地”在某些方法中用作參數,以便在不將對象分配給自身的情況下對其進行變異(分配在內部進行),而 apply() 不支持此功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.