我正在尝试根据条件计算给定列的值。
基本数据帧如下所示(假设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']
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())
答案 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)