pandas 如何根据两个panda Dataframe 参数的当前值来控制在函数中应用哪个公式?

aydmsdu9  于 2023-03-16  发布在  其他
关注(0)|答案(2)|浏览(97)

我有一个函数f(a,B),它取两个Pandas Dataframe ,对值应用不同的公式,如下所示:

def f(a, b):
   if a > 0 and b > 0:
      return a + b
   elif a > 0 and b < 0:
      return a - b
   elif a < 0 and b > 0:
      return a * b
   elif a < 0 and b < 0:
      return a / b
   else:
      print('bad')

dfa = pd.DataFrame({'a':[1, 1]})
dfb = pd.DataFrame({'b':[2, 2]})
f(dfa,dfb)

这里的问题特别是,我需要函数中处理的当前值来分支,然而,使用and操作符会导致下面的结果。
Series的真值不明确。请使用.empty、.bool()、. item()、.any()或.all()
而使用&将导致
“无法将[type]数组与[bool]类型的标量进行比较”
编辑:
考虑到这些答案,我开始意识到我最小的例子可能不能很好地传达我的意图。

def f(a, b):
  if a > 0 and b > 0:
    X = operationA()
  elif a > 0 and b < 0:
    X = operationB()
  elif a < 0 and b < 0:
    X = operationC()
  elif a < 0 and b < 0:
    X = operationD()
  else:
    print('bad')

  Y = operationY()
  return X, Y

# both dataframes are part of a training example label example = (a, b)
df_label_partA = pd.DataFrame({'a':[1, 1, -1, -1]})
df_label_partB = pd.DataFrame({'b':[1, -1, 1, -1]})
f(df_label_partA, df_label_partB)

不能单独考虑 Dataframe ,因为每个帧都是标签列表的一部分(基本上是分成2个列表的元组)

2nc8po8w

2nc8po8w1#

试试这个:

pd.concat([dfa,dfb], axis=1).apply(lambda x: f(*x), axis=1)

输出:

0    3
1    3
dtype: int64
bnl4lu3b

bnl4lu3b2#

你可以试试这个

def f(a, b):
   if all(a > 0) and all(b > 0):
      return dfa.a + dfb.b
   elif all(a > 0) and all(b < 0):
      return dfa.a - dfb.b
   elif all(a < 0) and all(b > 0):
      return dfa.a * dfb.b
   elif all(a < 0) and all(b < 0):
      return dfa.a / dfb.b
   else:
      print('bad')

dfa = pd.DataFrame({'a':[1, 1]})
dfb = pd.DataFrame({'b':[2, 2]})
f(dfa,dfb)

输出

0    3
1    3
dtype: int64

相关问题