如何Pandas fillna() with mode of column?
How to Pandas fillna() with mode of column?
我有一个数据集,其中有一个名为 'Native Country' 的列,其中包含大约 30000 条记录。有些缺失由 NaN
表示,所以我想用 mode()
值填充它。我写了这样的东西:
data['Native Country'].fillna(data['Native Country'].mode(), inplace=True)
然而,当我计算缺失值时:
for col_name in data.columns:
print ("column:",col_name,".Missing:",sum(data[col_name].isnull()))
它仍然为 Native Country 列提供相同数量的 NaN
值。
只需调用系列的第一个元素:
data['Native Country'].fillna(data['Native Country'].mode()[0], inplace=True)
或者您可以对赋值做同样的事情:
data['Native Country'] = data['Native Country'].fillna(data['Native Country'].mode()[0])
请注意,NaN 可能是您的数据帧的模式:在这种情况下,您要将 NaN 替换为另一个 NaN。
如果我们用fillna(df['colX'].mode())
填充缺失值,由于mode()
的结果是一个系列,它只会填充匹配索引的前几行。至少如果按以下方式完成:
fill_mode = lambda col: col.fillna(col.mode())
df.apply(fill_mode, axis=0)
但是,通过简单地获取系列的第一个值 fillna(df['colX'].mode()[0])
,我认为我们冒着在数据中引入意外偏差的风险。如果样本是多峰的,只取第一个众数会使已经有偏差的插补方法变得更糟。例如,如果我们将 [0, 21, 99]
作为同样最频繁的值,则只取 0
。或者当 True
和 False
值在给定列中出现的频率相同时,用 False
填充缺失值。
我这里没有明确的解决方案。如果必须使用该模式,则从所有局部最大值分配一个随机值可能是一种方法。
尝试这样的事情:
fill_mode = lambda col: col.fillna(col.mode())
和功能:
new_df = df.apply(fill_mode, axis=0)
你可以得到号码'mode'或任何其他策略
- 模式:
num = data['Native Country'].mode()[0]
data['Native Country'].fillna(num, inplace=True)
- 对于平均值,中位数:
num = data['Native Country'].mean() #or median(); No need of [0] because it returns a float value.
data['Native Country'].fillna(num, inplace=True)
或者像这样在一行中
data['Native Country'].fillna(data['Native Country'].mode()[0], inplace=True)
import numpy as np
import pandas as pd
print(pd.__version__)
1.2.0
df = pd.DataFrame({'Country': [np.nan, 'France', np.nan, 'Spain', 'France'], 'Purchased': [np.nan,'Yes', 'Yes', 'No', np.nan]})
Country
Purchased
0
NaN
NaN
1
France
Yes
2
NaN
Yes
3
Spain
No
4
France
NaN
df.fillna(df.mode()) ## only applied on first row because df.mode() returns a dataframe with one row
Country
Purchased
0
France
Yes
1
France
Yes
2
NaN
Yes
3
Spain
No
4
France
NaN
df = pd.DataFrame({'Country': [np.nan, 'France', np.nan, 'Spain', 'France'], 'Purchased': [np.nan,'Yes', 'Yes', 'No', np.nan]})
df.fillna(df.mode().iloc[0]) ## convert df to a series
Country
Purchased
0
France
Yes
1
France
Yes
2
France
Yes
3
Spain
No
4
France
Yes
对于那些来这里(像我一样)在多列中填充 NA 的人,按多列分组并且遇到模式 returns nothing 的问题,组中只有 NA 值:
df[['col_to_fill_NA_1','col_to_fill_NA_2']] = df.groupby(['col_to_group_by_1', 'col_to_group_by_2'], dropna=False)[['col_to_fill_NA_1','col_to_fill_NA_2']].transform(lambda x: x.fillna(x.mode()[0]) if len(x.mode()) == 1 else x)
您可以填写任意数量的“col_to_fill_NA”并按任意数量的“col_to_group_by”进行分组。
if 语句 returns mode if mode exists and returns NAs for the groups, where there only NAs.
我有一个数据集,其中有一个名为 'Native Country' 的列,其中包含大约 30000 条记录。有些缺失由 NaN
表示,所以我想用 mode()
值填充它。我写了这样的东西:
data['Native Country'].fillna(data['Native Country'].mode(), inplace=True)
然而,当我计算缺失值时:
for col_name in data.columns:
print ("column:",col_name,".Missing:",sum(data[col_name].isnull()))
它仍然为 Native Country 列提供相同数量的 NaN
值。
只需调用系列的第一个元素:
data['Native Country'].fillna(data['Native Country'].mode()[0], inplace=True)
或者您可以对赋值做同样的事情:
data['Native Country'] = data['Native Country'].fillna(data['Native Country'].mode()[0])
请注意,NaN 可能是您的数据帧的模式:在这种情况下,您要将 NaN 替换为另一个 NaN。
如果我们用fillna(df['colX'].mode())
填充缺失值,由于mode()
的结果是一个系列,它只会填充匹配索引的前几行。至少如果按以下方式完成:
fill_mode = lambda col: col.fillna(col.mode())
df.apply(fill_mode, axis=0)
但是,通过简单地获取系列的第一个值 fillna(df['colX'].mode()[0])
,我认为我们冒着在数据中引入意外偏差的风险。如果样本是多峰的,只取第一个众数会使已经有偏差的插补方法变得更糟。例如,如果我们将 [0, 21, 99]
作为同样最频繁的值,则只取 0
。或者当 True
和 False
值在给定列中出现的频率相同时,用 False
填充缺失值。
我这里没有明确的解决方案。如果必须使用该模式,则从所有局部最大值分配一个随机值可能是一种方法。
尝试这样的事情:
fill_mode = lambda col: col.fillna(col.mode())
和功能:
new_df = df.apply(fill_mode, axis=0)
你可以得到号码'mode'或任何其他策略
- 模式:
num = data['Native Country'].mode()[0]
data['Native Country'].fillna(num, inplace=True)
- 对于平均值,中位数:
num = data['Native Country'].mean() #or median(); No need of [0] because it returns a float value.
data['Native Country'].fillna(num, inplace=True)
或者像这样在一行中
data['Native Country'].fillna(data['Native Country'].mode()[0], inplace=True)
import numpy as np
import pandas as pd
print(pd.__version__)
1.2.0
df = pd.DataFrame({'Country': [np.nan, 'France', np.nan, 'Spain', 'France'], 'Purchased': [np.nan,'Yes', 'Yes', 'No', np.nan]})
Country | Purchased | |
---|---|---|
0 | NaN | NaN |
1 | France | Yes |
2 | NaN | Yes |
3 | Spain | No |
4 | France | NaN |
df.fillna(df.mode()) ## only applied on first row because df.mode() returns a dataframe with one row
Country | Purchased | |
---|---|---|
0 | France | Yes |
1 | France | Yes |
2 | NaN | Yes |
3 | Spain | No |
4 | France | NaN |
df = pd.DataFrame({'Country': [np.nan, 'France', np.nan, 'Spain', 'France'], 'Purchased': [np.nan,'Yes', 'Yes', 'No', np.nan]})
df.fillna(df.mode().iloc[0]) ## convert df to a series
Country | Purchased | |
---|---|---|
0 | France | Yes |
1 | France | Yes |
2 | France | Yes |
3 | Spain | No |
4 | France | Yes |
对于那些来这里(像我一样)在多列中填充 NA 的人,按多列分组并且遇到模式 returns nothing 的问题,组中只有 NA 值:
df[['col_to_fill_NA_1','col_to_fill_NA_2']] = df.groupby(['col_to_group_by_1', 'col_to_group_by_2'], dropna=False)[['col_to_fill_NA_1','col_to_fill_NA_2']].transform(lambda x: x.fillna(x.mode()[0]) if len(x.mode()) == 1 else x)
您可以填写任意数量的“col_to_fill_NA”并按任意数量的“col_to_group_by”进行分组。 if 语句 returns mode if mode exists and returns NAs for the groups, where there only NAs.