我只需要在数据框的特定行中替换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
等于A
或B
并且col2
是NaN,那么我想将其替换为0。对于col1
的其他值,NaN应该保持不变。
我的第一个想法是使用pd.DataFrame.replace
并编写如下内容:
data.loc[data['col1'].isin(['A', 'B']), 'col2'].replace({np.nan: 0})
但它似乎无法按预期工作,并用0
填充所有NaN。
答案 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