如何更新Python Dataframe列,具体取决于另一列中是否存在子字符串

时间:2018-03-11 19:00:39

标签: python pandas dataframe

所以我有一个包含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行是突出显示为错误的行。

1 个答案:

答案 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