2017-07-06 49 views
1

我試圖根據某些相應組的中位數來取代年齡的nan值。我用groupby創建了一個名爲grouped_median的表。這是我的代碼:應用函數不會取代數據框中的值

def fillAges(row, grouped_median): 
    return grouped_median.loc[row['Sex'], row['Class'], row['Title']]['Age'] 


df['Age'] = df.apply(lambda x : fillAges(x, grouped_median) if np.isnan(x['Age']) else x['Age'], axis=1) 

df 

如果我只打印這一部分:

print(df.apply(lambda x : fillAges(x, grouped_median) if np.isnan(x['Age']) else x['Age'], axis=1)) 

值是正確的,但那麼一旦我看DF,楠值不會被替換。我感謝任何幫助。謝謝!編輯:正如Nathaniel所說,這段代碼工作正常。事實上,df是從列車和測試數據集連接起來的一個大數據框,帶有一個額外的「列車」或「測試」標誌列。那麼這就是我在做什麼:

df[df['flag']=='train']['Age'] = df[df['flag']=='train'].apply(lambda x : fillAges(x, grouped_median) if np.isnan(x['Age']) else x['Age'], axis=1) 

它不會工作。這會給我這個警告,但我認爲這只是一個警告,並不意味着它沒有做任何事情! 「一個值試圖在DataFrame的一個片段的副本上設置,嘗試使用.loc [row_indexer,col_indexer] = value請參閱文檔中的注意事項:pandas.pydata.org/pandas-docs/stable/...

所有我需要做的是去除[DF [「標誌」] ==「火車」]部分從左側。

我仍然不知道爲什麼這種方法是行不通的。謝謝

+0

查看關於使用'fillna()'進行插補的一篇文章(即用中位數填充缺失的數據):https://stackoverflow.com/questions/32617811/imputation-of-missing-values-for-categories-in -ndndas – NickBraunagel

+0

謝謝!但這對我不起作用。我想使用特定組的中位數。我製作了我的桌子,並使用了apply函數。中位數實際上不是我的問題。我的問題是爲什麼數據不會在數據框中被替換。 – user3709260

回答

2

你將不得不格式化函數來返回一個系列並返回一個系列,而不是隻操作系列中的一個元素。功能series_op下面應該爲你做這個。

def fillAges(row, grouped_median): 
    return grouped_median.loc[row['Sex'], row['Class'], row['Title']]['Age'] 

def series_op(x): 
    x['Age'] = fillAges(x, grouped_median) if np.isnan(x['Age']) else x['Age'] 
    return x 


corrected_df = df.apply(series_op, axis=1) 

我沒有你的數據也沒有grouped_median所以我不能複製你的問題。利用我製作的一些測試數據,我能夠正確地工作,但也能讓你的工作正常進行。

+1

不正確。 'apply()'肯定返回值。 – JohanL

+1

@JohanL,你好。你是對的。 –

+0

非常感謝納撒尼爾!很棒。對不起,但我不明白爲什麼我的方法是錯誤的。我的代碼將需要一系列必需的元素,並會返回這些元素,我希望將它們分配給我的df。我正在嘗試學習;爲什麼它不起作用?我是否應該永遠不會將一系列的一部分傳遞給#apply函數? – user3709260

相關問題