簡體   English   中英

為pandas DataFrame設置值:警告試圖在DataFrame的切片副本上設置值

[英]Setting a value to a pandas DataFrame: Warning A value is trying to be set on a copy of a slice from a DataFrame

為什么是這樣? 我將在熊貓中制作4個數據框:

>>> df = pd.DataFrame({"A": ["One","Two","Three"], "B": ["Two","Three","Four"], "C": ["Three","Four","Five"], "D": ["Four","Five","Six"]})
>>> df
       A      B      C     D
0    One    Two  Three  Four
1    Two  Three   Four  Five
2  Three   Four   Five   Six
>>> df["C"][1] = "One Hundred"

一切正常。 現在讓我們先做兩列,然后添加兩列,一列用“”,另一列用NaN

>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = pd.np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN
>>> df["C"][1] = "hello"

Warning (from warnings module):
  File "__main__", line 1
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

出現警告! 好的:(這是問題:警告的含義是什么?)但讓我們繼續:

現在我這樣做:

>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4], "C": [3,4,5], "D": [4,5,6]})
>>> df
   A  B  C  D
0  1  2  3  4
1  2  3  4  5
2  3  4  5  6
>>> df["C"][1] = 100

並且沒有警告出現。 好。

現在,讓我們再次觸發警告:

>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df["C"] = ""
>>> df["D"] = pd.np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN
>>> df["C"][1] = "hello"
>>> 

這次沒有警告!?

我正在使用IDLE 3.5.2,Python版本:3.5.2 ...

這是錯誤嗎? 我不能說,因為我正在學習。

我是否應該用所有列編寫一個新的單獨的DataFrame,然后每次將其等於df的列?

我應該列出一個python列表嗎?...

有沒有辦法在沒有警告的情況下遍歷和編輯原始數據框?

為什么沒有每次都彈出該警告?

謝謝你的時間。

您可以使用lociloc

df
Out[1445]: 
     A  A_1    B
0  1.0  1.0    A
1  NaN  NaN    A
2  3.0  3.0  NaN
3  4.0  4.0    B
df.iloc[1,1]='Yourvalue1'
df
Out[1447]: 
     A         A_1    B
0  1.0           1    A
1  NaN  Yourvalue1    A
2  3.0           3  NaN
3  4.0           4    B
df.loc[1,'A']
Out[1448]: nan
df.loc[1,'A']='Yourvalue2'
df
Out[1450]: 
            A         A_1    B
0           1           1    A
1  Yourvalue2  Yourvalue1    A
2           3           3  NaN
3           4           4    B

我認為正確的方法是編寫一個函數並將其與apply方法一起使用。

df.apply(my_function, axis=1)

這里顯示的那樣,以便熊貓可以超快地完成其任務。

正確的方法是:

df["column_name"][0] = "hello"

如果使用點column_name方式,則顯然是在選擇切片。 如果您使用這種(正確的)方法,那么您就是在“觸摸單元格”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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