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

时间:2018-12-24 19:40:41

标签: 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    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

我需要将第四行的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

2 个答案:

答案 0 :(得分:2)

首先,我建议您阅读Indexing and selecting data的熊猫书。 关于第一个问题,您可以将.loc()isnull()结合使用以对列值执行布尔索引:

mask_nans = test.loc[3,:].isnull()
test.loc[3, mask_nans] = test.loc[0, mask_nans]

要使值加倍,还可以使用.loc()直接乘以2切片的数据帧:

test.loc[1,'b':] *= 2

   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   4.0   7.0   7.0
4  5   NaN   NaN   NaN

答案 1 :(得分:1)

带有标签的索引

如果您希望按data.aws_ami_id进行过滤,并且a的值是唯一的,请考虑将其作为索引以简化逻辑 并使之更有效:

a

布尔掩码

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

fillna