我有一个数据框,其中包含员工信息,例如姓名,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的范围来获取薪水
答案 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