根据条件将函数应用于数据框中的列

Applying a function to columns within a dataframe based on a condition

以下代码的目标是遍历 5 列数据,如果在 'condition' 列中满足条件,则将函数应用于列中的该行。

我有一个数据框,我在其中设置了一个列作为条件的结果:

def WanCon(y):
  if (30 <= y <= 48):
    return 1
  else:
    return 2
time = four70['WY WEEK']
Wandata = pd.DataFrame(time)
Wandata['Condition'] = list(map(WanCon,Wandata['WY WEEK']))

然后我将 5 列的值复制到新数据框中 Wandata,其中对象 a-e 是我以下函数中的 x 值。

name = 'WANAP'

a = four40[name]
b = eight40[name]
c = four70[name]
d = eight70[name]
e = Historical[name]

Wandata[['440','840','470','870','Historical']] = [a,b,c,d,e]
Wandata.replace("",float('NaN'),inplace=True)

然后我有两个公式,我想根据上述条件应用于新添加的列,其中应用值为 1 Waneq1() 的条件中的任何行,否则应用 Waneq2()

def Waneq1(x):
  return((model1.c[0]*x**3)+(model1.c[1]*x**2)+(model1.c[2]*x)+(model1.c[3]))

def Waneq2(x):
  return((model2.c[0]*x**3)+(model2.c[1]*x**2)+(model2.c[2]*x)+(model2.c[3]))


for column in Wandata[['440','840','470','870','Historical']]:
  if Wandata['Condition']==1:
    Waneq1()
  else:
    Waneq2()

我是 python 的新手,这是我到过的最远的地方。我想知道是否有人知道实现此目标的更好方法,因为第三步对我来说相当具有挑战性,而且我遇到了障碍。

不清楚您具体要做什么(我们也不知道 four40 等对象是什么),但在 pandas dataframe 上应用条件的正确方法通常是:

wandata['output column'] = (model2.c[0]*x**3)+(model2.c[1]*x**2)+(model2.c[2]*x)+(model2.c[3]) # The default value of the column
wandata.loc[wandata['condition'] == 1, 'output columns'] = (model1.c[0]*x**3)+(model1.c[1]*x**2)+(model1.c[2]*x)+(model1.c[3]) # The value if the condition is true