我有两个DF,一个是
DF1
Name Salary IDnum Age City
Mike Thanks 52000 542 52 NYC
Bob Very 15000 451 21 LA
Sam You 72000 556 21 SF
另一个DF仅具有IDnum,其中标题按城市和奖励(获得3 / 2x)打破(在这种情况下,只有Sam,您可以获得3 / 2x的奖励,外加IDnum 134的员工在某处)吹我的前三排。
DF2
NYC LA SF Bonus
0 542 451 421 556
1 745 345 367 134
我的目标是要有一个新的DF,它使用D2中的薪水DF1和ID Num
获取新的DF3
目标是拥有这样的东西。我非常想避免将其添加到第一个DF中,因为这会产生诸如重复和日期冲突之类的问题。
Name IDnum Age City Bonus
Mike Thanks 542 52 NYC 52000
Bob Jame 451 21 LA 15000
Sam You 556 21 SF 108000
答案 0 :(得分:1)
使用np.where和isin来检查值是否存在于另一个df的列中,然后执行X(如果存在)和Y(如果不存在)。
方法1:作为一列添加到现有df中,然后将其移动到新的df中
df1['Adj_Salary']= np.where(df1['IDnum'].isin(df2['Bonus']),df1['Salary']*1.5,df1['Salary'] )
df3=df1.join(pd.DataFrame(df1.pop('Adj_Salary').values.tolist(),index=df1.index))
df3.drop('Salary', axis=1,inplace=True)
df3.rename(columns={0:'Bonus'},inplace=True)
方法2:使用concat()
创建新df时,将列添加到新df中
a=pd.Series(np.where(df1['IDnum'].isin(df2['Bonus']),df1['Salary']*1.5,df1['Salary']))
df3=pd.concat((df1.loc[:, df1.columns != 'Salary'],a.rename('Bonus')),axis=1, join='inner')
Name IDnum Age City Bonus
Mike Thanks 542 52 NYC 52000.0
Bob Very 451 21 LA 15000.0
Sam You 556 21 SF 108000.0
答案 1 :(得分:1)
仅使用Bonus_df(df2)中所需的IDs
并用它过滤薪水(df1)。
然后,您只需乘以基本工资的奖金百分比,就可以更新工资中的价值(顺便说一句,这是非常慷慨的,我可以在您的工作地点申请吗?JK):
为此,请使用isin()
:
df3 = df1[df1['IDnum'].isin(df2['Bonus'].values.tolist())] # just get the employees in df1 whose ids exist in df2
df3.reset_index(inplace = True, drop = True) # You need to reset the index, since we are updating columns, if you don't update it you would perform update on a slice of dataframe which tends to give warning, we don't want warning now do we? :D
df3['Bonus'] = df3['Salary']*(3/2) # Create the bonus field
del df3['Salary'] # Delete the salary field if you don't want it in your final df
瞧,这就是您想要的DataFrame。
希望这会有所帮助:))