簡體   English   中英

熊貓填np.nan問題

[英]Pandas fill np.nan issue

環境

  • Windows 8.1
  • python 3.5
  • 大熊貓

我想做的事

根據以下規則在pandas.DataFrame列中填充np.nan

  1. 如果值是數字, np.nan用其余值的平均值填充np.nan
  2. 如果值不是數字, 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' 但是,我如何實現我的目標? 任何幫助,將不勝感激。 謝謝。

解決方案(2016/4/29)

解決方法1

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)

溶液2

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.

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