Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将一行中的NaN替换为另一行中的值_Python_Pandas_Dataframe_Nan - Fatal编程技术网

Python 如何将一行中的NaN替换为另一行中的值

Python 如何将一行中的NaN替换为另一行中的值,python,pandas,dataframe,nan,Python,Pandas,Dataframe,Nan,我尝试了几种方法用另一行中的值替换一行中的NaN,但都没有达到预期效果。这是我的数据框: test = pd.DataFrame( { "a": [1, 2, 3, 4, 5], "b": [4, 5, 6, np.nan, np.nan], "c": [7, 8, 9, np.nan, np.nan], "d": [7, 8, 9, np.nan, np.nan] } ) a b c

我尝试了几种方法用另一行中的值替换一行中的NaN,但都没有达到预期效果。这是我的数据框:

test = pd.DataFrame(
    {
        "a": [1, 2, 3, 4, 5], 
        "b": [4, 5, 6, np.nan, np.nan], 
        "c": [7, 8, 9, np.nan, np.nan], 
        "d": [7, 8, 9, np.nan, np.nan]
     }
)

   a    b    c    d
0  1   4.0  7.0  7.0
1  2   5.0  8.0  8.0
2  3   6.0  9.0  9.0
3  4   NaN  NaN  NaN
4  5   NaN  NaN  NaN
我需要将第4行中的NaN替换为第一行中的值,即

   a     b     c     d
0  1   **4.0   7.0   7.0**
1  2    5.0   8.0   8.0
2  3    6.0   9.0   9.0
3  4   **4.0   7.0   7.0**
4  5    NaN   NaN   NaN
第二个问题是如何将一行中的一些/部分值乘以一个数字,例如,当列为
['b','c','d']
时,我需要将第二行中的值加倍,结果是:

   a     b     c     d
0  1    4.0   7.0   7.0
1  2   **10.0  16.0  16.0**
2  3    6.0   9.0   9.0
3  4    NaN   NaN   NaN
4  5    NaN   NaN   NaN

首先,我建议你读一些关于熊猫的书。 关于第一个可用于对列vaulues执行布尔索引的问题:

mask_nans = test.loc[3,:].isnull()
test.loc[3, mask_nans] = test.loc[0, mask_nans]
要将值加倍,您可以直接乘以切片数据帧
2
,也可以使用:

使用标签索引 如果您希望通过<代码> > <代码> >代码> > 值是唯一的,请考虑将其作为简化逻辑的索引,并使其更有效:

test = test.set_index('a')
test.loc[4] = test.loc[4].fillna(test.loc[1])
test.loc[2] *= 2
布尔掩码 如果
a
不是唯一的,并且需要布尔掩码,您仍然可以使用
fillna
,并执行一个附加步骤:

mask = test['a'].eq(4)
test.loc[mask] = test.loc[mask].fillna(test.loc[test['a'].eq(1).idxmax()])
test.loc[test['a'].eq(2)] *= 2

嗨,尼克松。谢谢你回答我的问题。但是对于第一个问题,我只需要替换NaN值,而不是整行。谢谢,jpp。你的回答很有帮助!
mask = test['a'].eq(4)
test.loc[mask] = test.loc[mask].fillna(test.loc[test['a'].eq(1).idxmax()])
test.loc[test['a'].eq(2)] *= 2