我有以下df
我想创建一个 RCA 列,如果 (empPeople/TotalEmpRegion)/(totalEmpActivity/totalEmp) > 1 则值为 1,否则为 0。然后,我会将此 df 转换为具有 index=region 和 column=activity 以及 values=rca 的数据透视表。
我写了下面的函数
def rca_emp(activity:str, region:str , emp:float):
top = emp / df[df['region'] == region].empPeople.sum()
bottom = df[df['activity'] == activity].empPeople.sum() / df.empPeople.sum()
rca = top/bottom
if rca > 1:
return 1
else:
return 0
然后我使用 apply 方法创建了一个列 rca
# finding RCA
df['rca'] = df.apply(lambda x : rca_emp(activity=x['activity'] , region=x['region'] , emp=x['empPeople']) , axis=1)
# create a binary matrix
df.pivot(index='region', columns='activity', values='rca')
问题是应用函数需要太多时间(6047 秒)。我想知道是否有更快的方法来完成这项任务?
最佳答案
相反,您的函数使用 GroupBy.transform
使用 sum
并在 numpy.where
中创建 0,1
:
s1 = df.groupby('activity')['empPeople'].transform('sum')
s2 = df.groupby('region')['empPeople'].transform('sum')
df['rca'] = np.where((df['empPeople'] / s2) / (s1 / df.empPeople.sum()) > 1, 1, 0)
测试输出:
print (df)
activity region empPeople
0 12122 1101 2
1 23322 1233 40
2 22223 2323 0
3 12122 1101 1
4 23322 1233 4
5 22223 2323 6
def rca_emp(activity:str, region:str , emp:float):
top = emp / df[df['region'] == region].empPeople.sum()
bottom = df[df['activity'] == activity].empPeople.sum() / df.empPeople.sum()
rca = top /bottom
if rca > 1:
return 1
else:
return 0
df['rca'] = df.apply(lambda x : rca_emp(activity=x['activity'] , region=x['region'] , emp=x['empPeople']) , axis=1)
s1 = df.groupby(['activity'])['empPeople'].transform('sum')
s2 = df.groupby(['region'])['empPeople'].transform('sum')
df['rca1'] = np.where((df['empPeople'] / s2) / (s1 / df.empPeople.sum()) > 1, 1, 0)
print (df)
activity region empPeople rca rca1
0 12122 1101 2 1 1
1 23322 1233 40 1 1
2 22223 2323 0 0 0
3 12122 1101 1 1 1
4 23322 1233 4 0 0
5 22223 2323 6 1 1
关于python - pandas 应用函数性能优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73687528/