使用掩码

时间:2018-03-22 22:07:43

标签: python pandas

考虑以下代码来创建两个pandas DataFrames ab

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中的行01 /列"B""C"已替换为replacement_value

2 个答案:

答案 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