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

用另一个Python的值填充一列的nan,python,python-3.x,pandas,dataframe,replace,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

我有一个数据集,该数据集已合并在一起,以填补彼此之间的缺失值

问题是,我有一些列缺少数据,现在我想用不缺少的值填充这些列

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

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\u x
匹配到
Number\u y
Op\u x
匹配到
Op\u y

需要注意的一点是,当两个ID相同时,有时它们的值会不同;类似于
Johnson
,具有
ID=2
,具有不同的数字,但op值相同。我想保留这些,因为我需要对它们进行更多的调查


此外,如果该行有两个
Number\ux
Number\uy
缺失值,我想将该行取出,就像
Johnson
使用
Number\ux
Number\uy
作为
nan
值缺失一样。

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

让我们使用
axis=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

为什么最后第二排的一个是1,另一个是10?对不起-已更正。谢谢。您还有重复的列输入输出,_x和_y是相同的吗?关于
df.loc[df.isnull().any(axis=1),:]=df.ffill()
为什么最后第二行是1,另一行是10?抱歉-已更正。谢谢。你还有重复的列输入输出,_x和_y是一样的吗?关于
df.loc[df.isnull().any(axis=1),:]=df.ffill()
astype(int)对于
['Number','Op']
@pygo原始的df应该是浮动的,这就是为什么我把它保留在这里的原因。这只是部分df。@W-B,很好的解决方案,+1astype(int)表示
['Number','Op']
@pygo原始df应该是float,这就是为什么我把它保留在这里。这只是部分df。@W-B,很好的解,+1