簡體   English   中英

應用函數后,在 DataFrame 中就地更改系列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM