熊猫菲尔纳模式

时间:2017-03-14 14:54:18

标签: python pandas fillna

我有一个数据集,其中有一个名为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值。

7 个答案:

答案 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]。或在给定列中FalseTrue值同等频繁的情况下,用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。