2016-07-28 50 views
0

我已經在Python 3 Jupyter筆記本中讀取了一張調查響應的Excel表格,並希望刪除個人在某個特定程序中的行。所以我使用.loc從dataframe'df'分到了一個新的數據框'dfgeneral'。如何子集數據框並解決Python中的SettingWithCopy警告?

notnurse = df['Program Code'] != 'NSG' 
dfgeneral = df.loc[notnurse,:] 

我再想(即滿意,不滿意)到標籤映射到被用來表示它們的代碼,並找到的受訪者是誰給了每個響應的數量。幾個問題使用相同的比例,所以我通過他們循環:

q5list = ['Q5_1','Q5_2','Q5_3','Q5_4','Q5_5','Q5_6'] 

scale5_dict = {1:'Very satisfied',2:'Satisfied',3:'Neutral', 
       4:'Somewhat dissatisfied',5:'Not satisfied at all', 
       np.NaN:'No Response'} 

for i in q5list: 
    dfgeneral[i] = df[i].map(scale5_dict) 
    print(dfgeneral[i].value_counts(dropna=False)) 

在輸出中,我得到了SettingWithCopy警告:

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 

我用的.loc創建dfgeneral;這是一個誤報,還是我應該做出什麼改變?感謝您的幫助。

回答

3
dfgeneral = df.loc[notnurse,:] 

這行(第二行)取一個DataFrame的片段並將其分配給一個變量。當你想操縱那個變量時,你會看到警告(一個值試圖在DataFrame的一個切片副本上設置)。

更改該行:

dfgeneral = df.loc[notnurse, :].copy()