考虑以下代码来创建两个pandas DataFrames a
和b
:
import pandas as pd
import numpy as np
a = pd.DataFrame(
[
['X', 1, np.nan, 3],
['X', 4, 5, 6],
['Y', 7, 8, 9]
],
columns = ["Group", "A", "B", "C"]
)
b = pd.DataFrame(
[
['X', 1, 2, 3],
['X', 4, 5, np.nan],
['X', 7, 8, 9]
],
columns = ["Group", "A", "B", "C"]
)
如果DataFrame中的位置为NaN
,我想替换["A", "B", "C"]
列中的所有NaN
值。也就是说,我想使用以下面具:
missing_vals = pd.isnull(a) | pd.isnull(b)
print(missing_vals)
# Group A B C
#0 False False True False
#1 False False False True
#2 False False False False
我试过了:
replacement_value = -1
a[missing_vals] = replacement_value
但结果是:
TypeError: Cannot do inplace boolean setting on mixed-types with a non np.nan value
我也尝试使用a[missing_vals.loc[:, ["A", "B", "C"]]]
访问所需的列,但也产生了错误。
所需的输出是:
print(a)
# Group A B C
#0 X 1 -1 3
#1 X 4 5 -1
#2 Y 7 8 9
print(b)
# Group A B C
#0 X 1 -1 3
#1 X 4 5 -1
#2 X 7 8 9
请注意,两个DataFrame中的行0
和1
/列"B"
和"C"
已替换为replacement_value
。
答案 0 :(得分:2)
你可以使用面具
s=(a.isnull())|(b.isnull())
s
Out[297]:
Group A B C
0 False False True False
1 False False False True
2 False False False False
a.mask(s,-1)
Out[299]:
Group A B C
0 X 1 -1.0 3
1 X 4 5.0 -1
2 Y 7 8.0 9
b.mask(s,-1)
Out[300]:
Group A B C
0 X 1 -1 3.0
1 X 4 5 -1.0
2 X 7 8 9.0
答案 1 :(得分:2)
np.where
m = a.isnull() | b.isnull()
pd.DataFrame(np.where(m, -1, a), columns=a.columns)
Group A B C
0 X 1 -1 3
1 X 4 5 -1
2 Y 7 8 9