【问题标题】:How to update a Python Dataframe column dependent on the presence of a substring in another column如何根据另一列中是否存在子字符串来更新 Python Dataframe 列
【发布时间】:2018-04-18 00:45:01
【问题描述】:

所以我有一个包含 float64 类型列和一个包含字符串的对象类型列的数据框。

如果对象列包含子字符串“abc”,我想从浮点列中减去 12。如果对象列包含子字符串“def”,我想从浮点列中减去 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:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

注意:第 917 行是突出显示为错误的行。

【问题讨论】:

  • 什么样的错误?
  • 请在您的帖子中包含错误。
  • 道歉 - 原始帖子已被编辑以包含错误消息。

标签: python pandas dataframe


【解决方案1】:

发生错误是因为您正在测试布尔系列是 True 还是 False。这是不可能的。您可以测试所有或任何值是否为True,以返回单个布尔值,但这不是您要寻找的。​​p>

最好将计算向量化而不是引入循环。下面是如何通过 .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

【讨论】:

  • 感谢您的替代代码建议 - 这对我有用。另外,感谢您解释为什么我的原始代码不起作用。那么我是否正确,因为我无法使用 if 语句来做我想做的事情?
  • @Linda,没错。如果这个答案有帮助,请随时接受(左侧的绿色勾号),以便其他用户知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 2016-07-26
  • 2018-12-02
  • 1970-01-01
  • 2021-11-08
  • 2021-09-21
相关资源
最近更新 更多