如何根据其他变量估算缺失值

时间:2019-11-02 09:40:06

标签: python pandas missing-data

我有一个如下数据框:

df = pd.DataFrame({'one' : pd.Series(['a', 'b', 'c', 'd','aa','bb',np.nan,'b','c',np.nan, np.nan] ), 
  'two' : pd.Series([10, 20, 30, 40,50,60,10,20,30,40,50])} )

dataframe

其中第一列是变量,第二列是值。可变值是常量,永远不变。

示例'a'值为10 每当出现'a'时相应的值将为10

在第一列中缺少一些值,例如:NaN 10是a,NaN 40是d ,就像明智的数据框包含200个变量一样。

值不是连续变量,它们是离散且不可排序的

在这种情况下,我们如何估算缺失的值。 预期输出应为:

Expected output

请帮助我。

关于, 文卡特。

3 个答案:

答案 0 :(得分:2)

我认为通常最好将其分组并填写。我们使用DataFrame.groupby

df.groupby('two').apply(lambda x: x.ffill().bfill())

可以不使用groupby来完成,但是您必须按两列进行排序:

df.sort_values(['two','one']).ffill().sort_index()

  

下面,我向您展示另一个答案中提出的方法可能会失败:

以下是示例:

df=pd.DataFrame({'one':['a',np.nan,'c','d',np.nan,'c','b','b',np.nan,'a'],'two':[10,20,30,40,10,30,20,20,30,10]})
print(df)

   one  two
0    a   10
1  NaN   20
2    c   30
3    d   40
4  NaN   10
5    c   30
6    b   20
7    b   20
8  NaN   30
9    a   10

df.sort_values(['two']).fillna(method='ffill').sort_index()


  one  two
0   a   10
1   a   20
2   c   30
3   d   40
4   a   10
5   c   30
6   b   20
7   b   20
8   c   30
9   a   10

您可以在另一个答案中看到建议的方法在此处失败(请参阅第1行)。发生这种情况是因为某些NaN值可以是列“ two”的特定值的第一个,并用上一组的值填充。

如果我们先分组,就不会发生这种情况:

df.groupby('two').apply(lambda x: x.ffill().bfill())

  one  two
0   a   10
1   b   20
2   c   30
3   d   40
4   a   10
5   c   30
6   b   20
7   b   20
8   c   30
9   a   10

正如我所说的,我们可以使用DataFrame.sort_values,但是我们需要对这两列进行排序。我建议您使用此方法

df.sort_values(['two','one']).ffill().sort_index()

  one  two
0   a   10
1   b   20
2   c   30
3   d   40
4   a   10
5   c   30
6   b   20
7   b   20
8   c   30
9   a   10

答案 1 :(得分:1)

尝试一下:

df = df.sort_values(['two']).fillna(method='ffill').sort_index()

哪个会给你

   one  two
0    a   10
1    b   20
2    c   30
3    d   40
4   aa   50
5   bb   60
6    a   10
7    b   20
8    c   30
9    d   40
10  aa   50

答案 2 :(得分:0)

这里是:

df.ffill(inplace=True)

输出:

   one  two
0    a   10
1    b   20
2    c   30
3    d   40
4   aa   50
5   bb   60
6    a   10
7    b   20
8    c   30
9    d   40
10  aa   50