【问题标题】:Truth Value for series in ambiguous模棱两可的系列的真值
【发布时间】:2019-10-22 20:10:26
【问题描述】:

数据是一个简短的例子。我将有大约 11 种不同的 '如果这 2 个条件为 True,则返回 'this text' ',并将其应用于 3k 行。我将列名写为变量以避免为每个条件输入列名。

我不断收到 ValueError,真值模棱两可。我看到的所有帖子都在谈论使用按位 & 并用括号分隔每个测试。我做的。但它仍然错误。我尝试包含完全引用的列,但在 ValueError 上仍然存在错误。如果我从函数中取出“自我”,我会得到 TypeError。不知道如何解决这个问题。

data = [ [3.5, 6], [-4,-8],[4,1] ]
df = pd.DataFrame(data, columns=['line','value'])

l = df['line']
v = df['value']

def errortype(self):
   if (l >=0) & (v > l):
      return 'error1'
   elif (l < 0) & (v < l):
      return 'error2'

df['test']= df.apply(errortype, axis=1)

【问题讨论】:

  • 您的 if 语句中需要 allany。你有一个系列 l 并且你检查 l 是否 >= 0。好吧,如果 L 的一部分是负数而 L 的一部分是正数会怎样。 if 语句不明确。您是否要检查 l 的 any 部分是否为负数或 l 的 all 是否为负数?使用anyall
  • 这不是逐行进行。我认为使用 df.apply() 会在每一行上使用它。所以对于第 1 行。 '如果 3.5>=0 & 6 > 3.5" 返回 'error1'
  • L 仍然是您的全球系列。是的,df。正在按行进行,但 l 不是。
  • 仍然不能 100% 确定。我认为 & 意味着两者都需要为真才能使整个条件为真。还是在 Pandas 中它只是连接条件的一种方式?如果我需要两个条件都为真,那么我将如何重写 If 语句?

标签: python pandas


【解决方案1】:

试试:

data = [ [3.5, 6], [-4,-8],[4,1] ]
df = pd.DataFrame(data, columns=['line','value'])


#l = df['line']  do not need this line
#v = df['value']  do not need this line

def errortype(row):
#     print(row)
    if (row['line'] >=0) & (row['value'] > row['line']):
        return 'error1'
    elif (row['line'] < 0) & (row['value'] < row['line']):
        return 'error2'

df['test']= df.apply(errortype, axis=1)

输出:

   line  value    test
0   3.5      6  error1
1  -4.0     -8  error2
2   4.0      1    None

不过,更好的矢量化方式是使用np.select

cond1 = (df['line'] >= 0) & (df['value'] > df['line'])
cond2 = (df['line'] < 0) & (df['value'] < df['line'])

df['test'] = np.select([cond1,cond2],['error1','error2'],np.nan)

输出:

   line  value    test
0   3.5      6  error1
1  -4.0     -8  error2
2   4.0      1     nan

【讨论】:

  • 感谢斯科特,这行得通。但还是有一些疑问。无论如何我可以使用变量 l 和 v 或者因为我使用“行”我需要指定完整的列名?另外,您最初的回复提到使用 all/any,看起来如何?
  • 请告诉我,我不是计算机科学专业人士,但是当您 l = df['line'] 时,您正在获取 df 数据框中的系列并将其分配给 l。在你的函数中执行 print(l) 并观察会发生什么。你不是用 l 来“引用” df['line'] 。这是你的想法。忽略所有或任何评论,你不需要这个,因为你是逐行的。
  • 第二种方法无需迭代即可工作,因为 pandas 做了一种称为内在数据对齐的事情,这意味着几乎所有在 pandas 中完成的操作都会对齐(匹配)索引和列标题上的数据。
猜你喜欢
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 2018-12-03
  • 2022-09-28
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多