我有一个数据集,其中有一个名为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()))
仍然会为“原生国家/地区”列提供相同数量的NaN
值。
答案 0 :(得分:16)
只需调用系列的第一个元素:
data['Native Country'].fillna(data['Native Country'].mode()[0], inplace=True)
或者你也可以用assisgnment做同样的事情:
data['Native Country'] = data['Native Country'].fillna(data['Native Country'].mode()[0])
答案 1 :(得分:2)
如果我们用fillna(df['colX'].mode())
填充丢失的值,由于mode()
的结果是一个Series,它将只为匹配的索引填充前几行。至少按以下方式完成
fill_mode = lambda col: col.fillna(col.mode())
df.apply(fill_mode, axis=0)
但是,我认为仅取序列fillna(df['colX'].mode()[0])
的第一个值,我认为我们可能会在数据中引入意想不到的偏差。如果样本是多峰的,则仅采用第一个模态值会使已经有偏差的插补方法变得更糟。例如,如果我们有0
作为同等频繁的值,则仅取[0, 21, 99]
。或在给定列中False
和True
值同等频繁的情况下,用False
填充缺失值。
我这里没有明确的解决方案。如果需要使用该模式,则从所有局部最大值分配随机值可能是一种方法。
答案 2 :(得分:1)
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]})
国家 | 已购买 | |
---|---|---|
0 | NaN | NaN |
1 | 法国 | 是 |
2 | NaN | 是 |
3 | 西班牙 | 没有 |
4 | 法国 | NaN |
df.fillna(df.mode()) ## only applied on first row because df.mode() returns a dataframe with one row
国家 | 已购买 | |
---|---|---|
0 | 法国 | 是 |
1 | 法国 | 是 |
2 | NaN | 是 |
3 | 西班牙 | 没有 |
4 | 法国 | 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
国家 | 已购买 | |
---|---|---|
0 | 法国 | 是 |
1 | 法国 | 是 |
2 | 法国 | 是 |
3 | 西班牙 | 没有 |
4 | 法国 | 是 |
答案 3 :(得分:0)
注意,NaN可能是您的数据帧的模式:在这种情况下,您正在用另一个NaN替换NaN。
答案 4 :(得分:0)
尝试类似的方法:
USE AAA
SELECT DB_Name() 'Database', Version, CodeVersion INTO #TempTable FROM tDBVersion
USE AAB
INSERT INTO #TempTable
SELECT DB_Name() 'Database', Version, CodeVersion FROM tDBVersion
USE AAC
INSERT INTO #TempTable
SELECT DB_Name() 'Database', Version, CodeVersion FROM tDBVersion
SELECT * FROM #TempTable
-- ORDER BY "Version" asc
DROP TABLE #TempTable
-- My info sticks in the result pane while the table is dropped so that I don't forget to drop it
而功能:
fill_mode = lambda col: col.fillna(col.mode())
答案 5 :(得分:0)
您可以获得数字“模式”或任何其他策略
num = data['Native Country'].mode()
data['Native Country'].fillna(num, inplace=True)
或者像这样的一行
data['Native Country'].fillna(data['Native Country'].mode()[0], inplace=True)
答案 6 :(得分:0)
对于那些来到这里(就像我一样)在多列中填充 NAs 的人,按多列分组并且遇到模式不返回任何内容的问题,其中组中只有 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 语句在模式存在时返回模式并返回组的 NA,其中只有 NA。