如何根据另一列中是否存在子字符串来更新Python数据帧列

2024-06-28 15:34:49 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个包含float64类型列的dataframe和一个包含字符串的object类型列

如果object列包含子字符串'abc',我想从float列中减去12。如果object列包含子字符串def,我想从float列中减去24。如果object列既不包含“abc”也不包含“def”,我希望保持float列的原样

示例:

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()

不ote:Line 917 是突出显示为错误的


Tags: 字符串类型dfobjectdef错误floatbool
1条回答
网友
1楼 · 发布于 2024-06-28 15:34:49

发生错误的原因是您正在测试布尔级数是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

相关问题 更多 >