用另一Python的值填充一列的nan

时间:2019-01-21 16:57:22

标签: python python-3.x pandas dataframe replace

我有一个已合并在一起的数据集,以相互填充缺失值

问题是我有一些缺少数据的列,现在我要用不丢失的值填充。

输入的合并数据集如下所示:

Name         State       ID       Number_x      Number_y       Op_x       Op_y
Johnson      AL          1        1             nan            1956       nan
Johnson      AL          1        nan           nan            1956       nan
Johnson      AL          2        1             nan            1999       nan
Johnson      AL          2        0             nan            1999       nan
Debra        AK          1A       0             nan            2000       nan
Debra        AK          1B       nan           20             nan        1997
Debra        AK          2        nan           10             nan        2009
Debra        AK          3        nan           1              nan        2008
.
.

我想要的输出是这样的:

Name         State       ID       Number_x      Number_y     Op_x       Op_y
Johnson      AL          1        1             1            1956       1956
Johnson      AL          2        1             1            1999       1999
Johnson      AL          2        0             0            1999       1999
Debra        AK          1A       0             0            2000       2000
Debra        AK          1B       20            20           1997       1997
Debra        AK          2        10            10           2009       2009
Debra        AK          3        1             1            2008       2008
.
.

因此,我希望将所有nan值替换为其列中的关联值-将Number_xNumber_y匹配,将Op_xOp_y匹配

要注意的一件事是,当有两个相同的ID( ID)时,它们的值有时会有所不同;像JohnsonID = 2一样,它们具有不同的数字但具有相同的op值。我想保留这些,因为我需要对其进行更多的调查。

此外,如果该行的Number_xNumber_y缺少两个值,我想将该行删除-像JohnsonNumber_xNumber_y缺少为nan值。

1 个答案:

答案 0 :(得分:2)

让我们用groupbyaxis =1

df.groupby(df.columns.str.split('_').str[0],1).first().dropna(subset=['Number','Op'])
   ID     Name  Number      Op State
0   1  Johnson     1.0  1956.0    AL
2   2  Johnson     1.0  1999.0    AL
3   2  Johnson     0.0  1999.0    AL
4  1A    Debra     0.0  2000.0    AK
5  1B    Debra    20.0  1997.0    AK
6   2    Debra    10.0  2009.0    AK
7   3    Debra     1.0  2008.0    AK