python - pandas DataFrame 在 bool 掩码上设置值

标签 python pandas

我正在尝试将 pandas DataFrame 中的多个不同值全部设置为相同的值。我以为我了解 pandas 的 bool 索引,但我还没有找到关于这个特定错误的任何资源。

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

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

我可以用 df.replace 来代替,但是这里的掩码感觉更高效、更直观。有人可以解释错误,并提供一种有效的方法来设置所有值吗?

最佳答案

不幸的是,你不能在混合数据类型上使用 bool 掩码,你可以使用 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

注意:如果你在 where 方法中执行 inplace=True 上面的操作将会失败,所以 df.where(mask, other=30, inplace =True) 将引发:

TypeError: Cannot do inplace boolean setting on mixed-types with a non np.nan value

编辑

好吧,经过一点点误解你仍然可以使用 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

关于python - pandas DataFrame 在 bool 掩码上设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30519140/

相关文章:

python - Pandas 在数据框和系列(列)之间相乘

python - 使用 Pandas,如何使列表中的每个项目填充 pandas 列中的每个单元格

python - 如何在 Pandas 中以分钟为单位获得时差

python - 如果数据框行为 1,其余值设置为 0,如何设置最大值

python - 如何将彩色图图像反转为标量值?

python - scrapy startproject不使用指定的TEMPLATES_DIR来生成项目settings.py

python - Objective C 和 python - pyobjc

Python OpenCV 线程

python - 如何保持行元素之间变化的累积计数,忽略 NaN,并使用结果创建单独的列

python - apache Spark 输入路径不存在错误