我试图将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
,但屏蔽在这里感觉更有效率和直观。有人可以解释错误,并提供设置所有值的有效方法吗?
答案 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