如何使用A和B列使用DF2中的值在DF1上创建C列

时间:2019-09-11 11:22:40

标签: python pandas dataframe

我有一个数据框,其中包含员工信息,例如姓名,Performance_factor_1和Performance_factor_2。

我还有另一个数据框,可以根据Performance_factor_1和Performance_actor_2来获得报酬。

df1(很抱歉,格式不确定该如何解决)

Name                  pf1       pf2     pf3
Adam                  14.6      8.9     59 
Bob                   13.2      9       75
Charlie               11.1      9.1     89
Dylan                 14.6      9       97
Eric                  11.1      8.8     105
Fedderick             12.5      9.2     69

df2 数据框2的行为performance_factor_1,列为performance_factor_2。

pf1     8.8 8.9 9   9.1 9.2
14.6    100 200 300 400 500
13.2    200 300 400 500 600
12.5    300 400 500 600 700
11.1    400 500 600 700 800

对于df2 ['pf1'],它从1扩展到14,小数点后一位。对于列,它从8.8到10(带小数点)。如果能够使用8.8 -9.2之类的范围来获得值,那就更好了。但是,目前,我目前仅根据确切值来寻找薪水。

我想做的是,如果p3大于70,则将df1的第三列费用添加如下: df1

Name                  pf1       pf2      pay
Adam                  14.6      8.9      200
Bob                   13.2      9        400
Charlie               11.1      9.1      700
Dylan                 14.6      9        300
Eric                  11.1      8.8      400
Fedderick             12.5      9.2      700

我在编码方面尝试过的是: 1)使用一个函数,然后在下面的loc函数中调用它,但不断抛出“系列”对象是可变的,因此无法散列”错误

def indivpay(ttr, csat):
    dude = (indiv.at[ttr, csat])
    return dude
df1.loc[df1['pf3']>=70, 'pay'] =  indivpay(df_outer['pf1'], df_outer['pf2'])

2)在loc函数本身中获取薪水值,但它不断抛出“系列”对象是可变的,因此无法散列”错误

df_outer.loc[df_outer['# of Closed SRs']>=70, 'Individual Bonus'] =  indiv.at[df_outer['Time to Resolve'], df_outer['CSAT (NSE)'].astype(str)]

在使用loc函数之前,我已经解决了类似的问题,但是为此,我在同一数据框中基于A和B创建了列C.我为此使用了以下代码:

df.loc[df['Last Resolved Date'].notnull(), 'Duration'] =  (df['Closed Date'] - df['Date Opened'])

它能够用天数填写“持续时间”列。但是,此方法似乎不适用于上述问题。

最后,我想要的是仅当p3大于70时才将工资添加到基于pf1和pf2的df1中。

编辑: 现在可以使用pf1和pf2的范围来获取薪水

enter image description here

我为第二个问题创建了Using values from df1 to retrieve values from df2 where df2 columns and index contain a range of values

2 个答案:

答案 0 :(得分:3)

首先,您可以使用DataFrame.lookup创建新列:

#if pf1 is first column, not index
#df2 = df2.set_index('pf1')
df2 = df2.rename(columns=float)

df1['Pay'] = df2.lookup(df1['pf1'], df1['pf2'])
print (df1)
        Name   pf1  pf2  pf3  Pay
0       Adam  14.6  8.9   59  200
1        Bob  13.2  9.0   75  400
2    Charlie  11.1  9.1   89  700
3      Dylan  14.6  9.0   97  300
4       Eric  11.1  8.8  105  400
5  Fedderick  12.5  9.2   69  700

由于使用浮点数,可能会导致某些值不匹配,因为准确性,因此可能的解决方案是将10的多个值转换为整数:

df3 = df2.rename(index= lambda x: int(x * 10),
                 columns= lambda x: int(float(x) * 10))

df1['Pay'] = df3.lookup(df1['pf1'].mul(10).astype(int), df1['pf2'].mul(10).astype(int))
print (df1)
        Name   pf1  pf2  pf3  Pay
0       Adam  14.6  8.9   59  200
1        Bob  13.2  9.0   75  400
2    Charlie  11.1  9.1   89  700
3      Dylan  14.6  9.0   97  300
4       Eric  11.1  8.8  105  400
5  Fedderick  12.5  9.2   69  700

编辑:

如果可能,某些值不匹配:

df3 = df2.rename(index= lambda x: int(x * 10),
                 columns= lambda x: int(float(x) * 10))

out= []
for row, col in zip(df1['pf1'].mul(10).astype(int), df1['pf2'].mul(10).astype(int)):
    try:
        out.append(df3.at[row, col] )
    except KeyError:
        out.append(np.nan)

df1['Pay'] = out
print (df1)
        Name   pf1  pf2  pf3  Pay
0       Adam  14.6  8.9   59  200
1        Bob  13.2  9.0   75  400
2    Charlie  11.1  9.1   89  700
3      Dylan  14.6  9.0   97  300
4       Eric  11.1  8.8  105  400
5  Fedderick  12.5  9.2   69  700

最后,您可以按条件分配/创建新列:

df1.loc[df1['pf3']>=70, 'Pay_new'] = df1['Pay']
print (df1)
        Name   pf1  pf2  pf3  Pay  Pay_new
0       Adam  14.6  8.9   59  200      NaN
1        Bob  13.2  9.0   75  400    400.0
2    Charlie  11.1  9.1   89  700    700.0
3      Dylan  14.6  9.0   97  300    300.0
4       Eric  11.1  8.8  105  400    400.0
5  Fedderick  12.5  9.2   69  700      NaN

答案 1 :(得分:1)

首先使用pf1作为df2的索引。如果columns的类型为str,请将其转换为float。将pf1和y pf2用作索引df1之后。

df2.set_index('pf1',inplace=True) #if it not is index
df2.columns=[float(key) for key in df2.columns] #only if it is str
df1.set_index(['pf1','pf2'],inplace=True)

这使您可以使用pandas.DataFrame.stack轻松地将值分配给pay

df1['pay']=df2.stack()
df1.reset_index(inplace=True)
df1=df1.reindex(columns=['Name','pf1','pf2','pf3','pay'])
df1['new_pay']=df1['pay'].where(df1['pf3']>70)
print(df1)

输出:

        Name   pf1  pf2  pf3  pay  new_pay
0       Adam  14.6  8.9   59  200      NaN
1        Bob  13.2  9.0   75  400    400.0
2    Charlie  11.1  9.1   89  700    700.0
3      Dylan  14.6  9.0   97  300    300.0
4       Eric  11.1  8.8  105  400    400.0
5  Fedderick  12.5  9.2   69  700      NaN