pandas DataFrame在布尔掩码上设置值

时间:2015-05-29 00:14:46

标签: python pandas

我试图将pandas DataFrame中的许多不同设置为相同的值。我以为我理解了大熊猫的布尔索引,但是我还没有找到关于这个特定错误的任何资源。

import pandas as pd 
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'f']})
mask = df.isin([1, 3, 12, 'a'])
df[mask] = 30
Traceback (most recent call last):
...
TypeError: Cannot do inplace boolean setting on mixed-types with a non np.nan value

上面,我想用值True替换掩码中的所有30条目。

我可以改为df.replace,但屏蔽在这里感觉更有效率和直观。有人可以解释错误,并提供设置所有值的有效方法吗?

3 个答案:

答案 0 :(得分:12)

您不能在混合dtypes上使用布尔掩码,遗憾的是,您可以使用pandas where来设置值:

In [59]:
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'f']})
mask = df.isin([1, 3, 12, 'a'])
df = df.where(mask, other=30)
df

Out[59]:
    A   B
0   1   a
1  30  30
2   3  30

注意:如果您使用inplace=True方法执行where,则上述操作会失败,因此df.where(mask, other=30, inplace=True)会引发:

  

TypeError:不能对非类型的混合类型进行inplace布尔设置   np.nan值

修改

好的,经过一点误会之后你仍然可以使用where y来反转面具:

In [2]:    
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'f']})
mask = df.isin([1, 3, 12, 'a'])
df.where(~mask, other=30)

Out[2]:
    A   B
0  30  30
1   2   b
2  30   f

答案 1 :(得分:3)

我不是100%肯定,但我怀疑错误信息与不同dtypes中缺少数据的处理方式不一致有关。只有float有NaN,但是整数可以自动转换为浮点数,所以它不是问题。但是看起来混合数字dtypes和对象dtypes并不那么容易......

无论如何,您可以使用np.where轻松解决问题:

df[:] = np.where( mask, 30, df ) 

    A   B
0  30  30
1   2   b
2  30   f

答案 2 :(得分:1)

如果您想 使用不同的列来创建面具 ,则需要调用 values属性 数据框。

实施例

我们想说,我们想要替换A_1和' A_2'根据{{​​1}}和B_1中的面具。例如,将B_2(至999)中与A中的空值对应的值替换。

原始数据框:

B

所需的数据框

   A_1  A_2  B_1  B_2
0    1    4    y    n
1    2    5    n  NaN
2    3    6  NaN  NaN

代码:

   A_1  A_2  B_1  B_2
0    1    4    y    n
1    2  999    n  NaN
2  999  999  NaN  NaN