[英]Pandas fill np.nan issue
根據以下規則在pandas.DataFrame
列中填充np.nan
:
np.nan
用其余值的平均值填充np.nan
。 np.nan
用其余值的模式填充np.nan
。 以下代碼似乎不起作用。
# build DataFrame
dfna = pd.DataFrame(np.random.randn(100,5), columns=list('ABCDE'))
dfna['F'] = [random.choice(list('abcdefghijkf')) for i in range(100)]
dfna[::20] = np.nan
# filling np.nan
def filler(x):
if type(x) == 'numeric':
x.fillna(x.mean())
else:
x.fillna(x.mode())
dfna.apply(filler)
我知道為什么會失敗。 這是因為type(x)返回'pandas.core.series.Series'
。 但是,我如何實現我的目標? 任何幫助,將不勝感激。 謝謝。
numeric_cols = dfna._get_numeric_data().columns.tolist()
nonnumeric_cols = [c for c in dfna if c not in numeric_cols]
dfna_num = dfna.loc[:, numeric_cols] = \
dfna[numeric_cols].apply(lambda col: col.fillna(col.mean()))
dfna_nonnum = dfna.loc[:, nonnumeric_cols] = \
dfna[nonnumeric_cols].apply(lambda col: col.fillna(col.value_counts()[0]))
pd.concat([dfna_num, dfna_nonnum], axis=1)
for col in dfna.columns:
if dfna[col].dtype != 'object':
dfna[col].fillna(dfna[col].mean(),inplace=True)
else:
dfna[col].fillna(dfna[col].mode(), inplace=True)
謝謝大家!
首先,將數字和非數字列分開。
numeric_cols = dfna._get_numeric_data().columns.tolist()
nonnumeric_cols = [c for c in dfna if c not in numeric_cols]
然后,您可以將平均值分配給數字平均值,並使用value_counts
來獲取最頻繁出現的項目(或如果出現平局,則是此類項目中的第一個)。
dfna.loc[:, numeric_cols] = \
dfna[numeric_cols].apply(lambda col: col.fillna(col.mean()))
dfna.loc[:, nonnumeric_cols] = \
dfna[nonnumeric_cols].apply(lambda col: col.fillna(col.value_counts().head(1).index[0]))
或者您可以使用以下功能:
def filler(series):
avg = series._get_numeric_data().mean()
series.fillna(series.mode().values[0] if np.isnan(avg) else avg, inplace=True)
dfna.apply(filler)
我頭上的東西:
for col in dfna.columns:
if dfna[col].dtype != 'object':
dfna[col].fillna(dfna[col].mean(),inplace=True)
else:
dfna[col].fillna(dfna[col].mode(), inplace=True)
inplace=True
直接在框架內對其進行編輯(無副本)。
但是請注意,如果non-numeric
列中沒有公共元素,則mode
返回[]
,因此原始值保持不變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.