首页 > 解决方案 > 如何根据多个条件更改列的一部分中的值?

问题描述

如果它们不等于 3 个不同的字符串,我想更改列的一部分(第 109 到 140 行)的值。

我试图不迭代,现在我似乎只能在一种情况下这样做。

df.loc[109:140,1] != 'Method' or df.loc[109:140,1] != 'Replicates' or df.loc[109:140,1] != 'StandardDeviation'

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我试过这个:

df.loc[109:140,1] != ('Method', 'Replicates', 'StandardDeviation')

但它似乎使它成为一个“和”声明。

我经常遇到这个错误:ValueError:一个系列的真值是模棱两可的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

我试过用 a|代替,它也不起作用。

标签: pythonpandas

解决方案


# mcve:

# np.random.seed(42)
# df = pd.DataFrame({1: np.random.choice(('asdf', 'Method', 'Replicates', 'StandardDeviation'), 10)})

#                    1
# 0         Replicates
# 1  StandardDeviation
# 2               asdf
# 3         Replicates
# 4         Replicates
# 5  StandardDeviation
# 6               asdf
# 7               asdf
# 8         Replicates
# 9             Method

创建一个面具pd.Series.isin()

mask = df[1].isin(('Method', 'Replicates', 'StandardDeviation'))

并用于where更改掩码为的系列的子集False

df.loc[5:9, 1] = df.loc[5:9, 1].where(mask, 'new better value')

结果:

#                    1
# 0         Replicates
# 1  StandardDeviation
# 2               asdf
# 3         Replicates
# 4         Replicates
# 5  StandardDeviation
# 6   new better value
# 7   new better value
# 8         Replicates
# 9             Method

推荐阅读