所以我有一个包含float64类型列的数据框和一个包含字符串的对象类型列。
如果对象列包含子字符串' abc'我想从float列中减去12。如果对象列包含子字符串' def'我想从float列中减去24。如果对象列既不包含' abc'或者' def',我想按原样保留浮动列。
示例:
Nmbr Strng
52 abcghi
80 defghi
10 ghijkl
预期产出:
Nmbr Strng
40 abcghi
56 defghi
10 ghijkl
我尝试了以下操作,但一直收到错误:
if df.Strng.str.contains("abc"):
df.Nmbr = (df.Nmbr - 12)
elif df.Strng.str.contains("def"):
df.Nmbr = (df.Nmbr - 24)
else:
df.Nmbr = df.Nmbr
我得到的错误如下:
915 raise ValueError("The truth value of a {0} is ambiguous. "
916 "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
917 .format(self.__class__.__name__))
918
919 __bool__ = __nonzero__
ValueError:系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
注意:第917行是突出显示为错误的行。
答案 0 :(得分:0)
您的错误发生是因为您正在测试布尔系列是True
还是False
。这是不可能的。您可以测试所有值或任何值是否为True
,以返回单个布尔值,但这不是您要查找的内容。
优良作法是对您的计算进行矢量化而不是引入循环。以下是如何通过.loc
访问器实现逻辑。
df.loc[df['Strng'].str.contains('abc', regex=False, na=False), 'Nmbr'] -= 12
df.loc[df['Strng'].str.contains('def', regex=False, na=False), 'Nmbr'] -= 24
结果:
Nmbr Strng
0 40 abcghi
1 56 defghi
2 10 ghijkl