我们如何仅替换特定行中的NaN?

时间:2020-02-10 20:36:53

标签: python pandas

我只需要在数据框的特定行中替换NaN值。我的原始照片如下:

import pandas as pd
import numpy as np
pd.DataFrame.from_dict({'col1': 'A B A D E B C D E A'.split(), 
                        'col2': [np.nan, 0, 1, np.nan, np.nan, np.nan, 1, np.nan, np.nan, 0]})

如果col1等于AB并且col2是NaN,那么我想将其替换为0。对于col1的其他值,NaN应该保持不变。

我的第一个想法是使用pd.DataFrame.replace并编写如下内容:

data.loc[data['col1'].isin(['A', 'B']), 'col2'].replace({np.nan: 0}) 

但它似乎无法按预期工作,并用0填充所有NaN。

4 个答案:

答案 0 :(得分:2)

您可以只执行loc

df.loc[df.col1.isin(['A','B']) & df.col2.isna(), 'col2'] = 0

答案 1 :(得分:2)

我相信您打算使用口罩。

mask = data['col1'].isin({'A', 'B'})
data.loc[mask, 'col2'] = data.loc[mask, 'col2'].replace({np.nan, 0})
>>> data
  col1  col2
0    A   NaN
1    B   0.0
2    A   1.0
3    D   NaN
4    E   NaN
5    B   NaN
6    C   1.0
7    D   NaN
8    E   NaN
9    A   0.0

答案 2 :(得分:1)

您可以使用fillna代替replace

df['col2'] = df.loc[df['col1'].isin(['A','B']), 'col2'].fillna(0)
df

输出:

|    | col1   |   col2 |
|---:|:-------|-------:|
|  0 | A      |      0 |
|  1 | B      |      0 |
|  2 | A      |      1 |
|  3 | D      |    nan |
|  4 | E      |    nan |
|  5 | B      |      0 |
|  6 | C      |    nan |
|  7 | D      |    nan |
|  8 | E      |    nan |
|  9 | A      |      0 |

答案 3 :(得分:0)

数据:

    col1    col2
0   A   NaN
1   B   0.0
2   A   1.0
3   D   NaN
4   E   NaN
5   B   NaN
6   C   1.0
7   D   NaN
8   E   NaN
9   A   0.0

脚本:

mask1 = data['col1'].isin(['A', 'B'])
mask2 = data['col2'].isna()
mask = mask1 & mask2 
data.loc[mask, 'col2'] = 0

输出:

    col1    col2
0   A   0.0
1   B   0.0
2   A   1.0
3   D   NaN
4   E   NaN
5   B   0.0
6   C   1.0
7   D   NaN
8   E   NaN
9   A   0.0