簡體   English   中英

多列的 Pandas Fillna 與每列的模式

[英]Pandas Fillna of Multiple Columns with Mode of Each Column

使用人口普查數據,我想用這兩列的各自模式替換兩列(“workclass”和“native-country”)中的 NaN。 我可以輕松獲得模式:

mode = df.filter(["workclass", "native-country"]).mode()

它返回一個數據幀:

  workclass native-country
0   Private  United-States

然而,

df.filter(["workclass", "native-country"]).fillna(mode)

替換任何物體每列的NaN的,更不用說對應於該列的模式。 有沒有一種平穩的方法來做到這一點?

如果您想將某些列中的mode fillna數據fillna df缺失值,您可以通過iloc按位置選擇創建的Series iloc

cols = ["workclass", "native-country"]
df[cols]=df[cols].fillna(df.mode().iloc[0])

或者:

df[cols]=df[cols].fillna(mode.iloc[0])

您的解決方案:

df[cols]=df.filter(cols).fillna(mode.iloc[0])

樣本:

df = pd.DataFrame({'workclass':['Private','Private',np.nan, 'another', np.nan],
                   'native-country':['United-States',np.nan,'Canada',np.nan,'United-States'],
                   'col':[2,3,7,8,9]})

print (df)
   col native-country workclass
0    2  United-States   Private
1    3            NaN   Private
2    7         Canada       NaN
3    8            NaN   another
4    9  United-States       NaN

mode = df.filter(["workclass", "native-country"]).mode()
print (mode)
  workclass native-country
0   Private  United-States

cols = ["workclass", "native-country"]
df[cols]=df[cols].fillna(df.mode().iloc[0])
print (df)
   col native-country workclass
0    2  United-States   Private
1    3  United-States   Private
2    7         Canada   Private
3    8  United-States   another
4    9  United-States   Private

你可以這樣做:

df[["workclass", "native-country"]]=df[["workclass", "native-country"]].fillna(value=mode.iloc[0])

例如,

    import pandas as pd
d={
    'key3': [1,4,4,4,5],
    'key2': [6,6,4],
    'key1': [6,4,4],
}

df=pd.DataFrame.from_dict(d,orient='index').transpose()

那么df

  key3  key2    key1
0   1   6       6
1   4   6       4
2   4   4       4
3   4   NaN     NaN
4   5   NaN     NaN

然后通過做:

l=df.filter(["key1", "key2"]).mode()
df[["key1", "key2"]]=df[["key1", "key2"]].fillna(value=l.iloc[0])

我們知道df

  key3  key2    key1
0   1   6        6
1   4   6        4
2   4   4        4
3   4   6        4
4   5   6        4

我認為使用 dict 作為填充參數“值”是最干凈的

參考: https : //pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html

根據@miriam-farber 的回復創建一個玩具 df

import pandas as pd
d={
    'key3': [1,4,4,4,5],
    'key2': [6,6,4],
    'key1': [6,4,4],
}

d_df=pd.DataFrame.from_dict(d,orient='index').transpose()

創建一個字典

mode_dict = d_df.loc[:,['key2','key1']].mode().to_dict('records')[0]

在 fillna 方法中使用此 dict

d_df.fillna(mode_dict, inplace=True)

此代碼將平均值歸入 int 列,將模式歸入對象列,生成兩種類型的列的列表,並根據條件輸入缺失值。

cateogry_columns=df.select_dtypes(include=['object']).columns.tolist()
integer_columns=df.select_dtypes(include=['int64','float64']).columns.tolist()

for column in df:
    if df[column].isnull().any():
        if(column in cateogry_columns):
            df[column]=df[column].fillna(df[column].mode()[0])
        else:
            df[column]=df[column].fillna(df[column].mean)`

暫無
暫無

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

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