根据其他列的条件计算1列的值

时间:2019-09-12 15:27:11

标签: python pandas dataframe

我正在尝试根据条件计算给定列的值。

基本数据帧如下所示(假设col a和b来自先前的操作,因此是插入操作):

import pandas as pd
import numpy as np

df=pd.DataFrame({'a':[1,2,3,4,5],'b':[6,7,8,9,10]})

df.insert(1, 'calculated', np.nan)

现在,我正在尝试基于'a'和'b'计算'calculated'的值。

我尝试遍历数据帧的行,但是'calculated'列没有得到计算...

for index, row in df.iterrows():
    if row['a']>2:
        row['calculated'] = row['b']*2
    else:
        row['calculated'] = row['b']

result of iterrows

  • 使用df.apply似乎无法解决问题,因为我发现所有示例都在使用lambda的地方(如何传递a的值并将数据返回给使用lambda进行计算?)

我设法用以下代码做到了:

df.loc[df['a'] > 2, 'calculated'] = df['b']*2
df.loc[df['a'] <= 2, 'calculated'] = df['b']

但是,此代码非常容易出错,并且很难阅读。

是否有一种“更清洁”的方法来实现这一目标?一种轻松添加逻辑的方法。

类似吗?

def get_calculated_value(row):
  if row['a'] > 2:
    row['calculated'] = row['b'] * 2
  else:
    row['calculated'] = row['a']

df.apply(get_calculated_value())

3 个答案:

答案 0 :(得分:1)

import pandas as pd
import numpy as np

df=pd.DataFrame({'a':[1,2,3,4,5],'b':[6,7,8,9,10]})

df['calculated'] = df["b"].where(df["b"]>2, df["b"]*2)
display(df)

答案 1 :(得分:1)

您可以对lambda使用apply函数。您无需在函数内分配“计算”列。同样,使用apply(),以后可以添加或修改条件。

def myfunc(row):
    if row['a'] > 2:
        return row['b'] * 2
    else:
        return row['a']

df['calculated'] = df.apply(lambda x : myfunc(x), axis=1)

#output
df

    a   b   calculated
0   1   6   1
1   2   7   2
2   3   8   16
3   4   9   18
4   5   10  20

答案 2 :(得分:0)

使用np.where可以更快地完成此任务:

df['calculated']=np.where(df.a>2,2*df.b,df.b)