如何创建一个新的DF,其中最后一列乘以3/2过滤另一个DF的ID#?

时间:2019-08-30 01:53:19

标签: python pandas dataframe group-by pandas-groupby

我有两个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

2 个答案:

答案 0 :(得分:1)

使用np.whereisin来检查值是否存在于另一个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。

希望这会有所帮助:))