每列模式的多列Pandas Fillna

2024-06-09 20:34:04 发布

您现在位置:Python中文网/ 问答频道 /正文

使用人口普查数据,我想用这两列的相应模式替换两列中的NaNs(“工人阶级”和“本国”)。我可以很容易地得到模式:

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

返回数据帧:

  workclass native-country
0   Private  United-States

然而

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

不将每列中的nan替换为任何内容,更不用说与该列对应的模式了。有没有一个平滑的方法来做这件事?


Tags: 数据dfmode模式privatefiltercountryunited
3条回答

如果要用数据帧df的某些列中的mode来填充缺少的值,只需^{}通过Series创建,通过^{}按位置选择:

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作为fillna参数'value'是最干净的

参考号: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()

创建dict

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

在fillna方法中使用此dict

d_df.fillna(mode_dict, inplace=True)

相关问题 更多 >