Python 使用基于多个条件的值向dataframe添加新列
我的数据框为Python 使用基于多个条件的值向dataframe添加新列,python,pandas,dataframe,Python,Pandas,Dataframe,我的数据框为df1,我需要根据以下条件用值填充新列: 如果'name'等于'last\u name',则'salary'+'other' 如果'last\u name'为null,则'salary'+'other' 如果'name'不等于'last\u name',则('rate'*'other')+'salary' 我尝试了以下代码,但结果不正确: df = pd.DataFrame({'salary': [2000,5000,7000, 3500, 8000],'rate':[2,4,
df1
,我需要根据以下条件用值填充新列:
'name'
等于'last\u name'
,则'salary'+'other'
'last\u name'
为null
,则'salary'+'other'
'name'
不等于'last\u name'
,则('rate'*'other')+'salary'
df = pd.DataFrame({'salary': [2000,5000,7000, 3500, 8000],'rate':[2,4,6.5,7,5],'other':[4000,2500,4200, 5000,3000],
'name':['bob','sam','ram','jam','flu'], 'last_name' :['bob','gan','ram', np.nan, 'flu' ]})
您可以使用数据帧过滤一次完成这些操作。当您执行类似于
df[“name”]==df[“last_name”]
的操作时,您将创建一个布尔序列(称为“掩码”),然后可以使用它索引到数据帧中
#条件1-name==姓氏
name_equals_lastname=df[“name”]==df[“last_name”]#首先,创建布尔掩码
df.loc[name_equals_lastname,“new_col”]=df[“salary”]+df[“other”]#然后,使用掩码在正确的位置索引到数据帧中,只需设置这些值
#条件2-姓氏为空
last_name_is_null=df[“last_name”]。isnull()
df.loc[姓氏为空,“新列”]=df[“工资”]+df[“其他”]
#条件3-名称!=姓
姓名不等于姓氏=df[“姓名”!=df[“姓氏”]
df.loc[姓名不等于姓氏,“新列”]=(df[“费率”]*df[“其他”])+df[“工资”]
您还可以将df.apply()
与自定义函数一起使用,如下所示:
def my_逻辑(行):
如果行[“名称”]=行[“姓氏”]:
返回行[“薪资”]+行[“其他”]
埃利夫…#您可以在这里填写其余的逻辑
df[“new_col”]=df.apply(我的逻辑,axis=1)#需要axis=1来传递行而不是列
根据您的条件,您不需要if-else。只需将np.where
与组合布尔掩码一起使用即可
if np.where(df["name"] == df["last_name"]) is True:
df['new_col'] = df['salary'] + df['other']
else:
df['new_col'] = (df['rate'] * df['other']) + df['salary']
谢谢但是我们没有使用if语句的其他解决方案吗..只是asking@mathew--我建议使用“if”语句的唯一解决方案是使用您的逻辑编写函数,然后将其传递给
df.apply(my_func)
(其中my_func包含您的逻辑)。虽然可能还有另一个if/else解决方案,但熊猫并不是真的要这样使用的。不过,我现在将把df.apply()
方法添加到我的解决方案中,这样您就可以看到它了。@Andy..我在您的建议中发现以下错误..AttributeError:'Series'对象没有属性'isna'。您似乎有一个旧版本的熊猫。在这种情况下,请尝试使用isnull
作为c2=df[“姓氏”]。isnull()
c1 = df["name"] == df["last_name"]
c2 = df["last_name"].isna()
df['new_col'] = np.where(c1 | c2,
df['salary'] + df['other'],
df['rate'] * df['other'] + df['salary'])
Out[159]:
salary rate other name last_name new_col
0 2000 2.0 4000 bob bob 6000.0
1 5000 4.0 2500 sam gan 15000.0
2 7000 6.5 4200 ram ram 11200.0
3 3500 7.0 5000 jam NaN 8500.0
4 8000 5.0 3000 flu flu 11000.0