pandas apply函数性能优化

3
我有以下数据框(df)。
活动(activity) 地区(region) 从业人员(empPeople)
12122 1101 2
23322 1233 40
22223 2323 0
... ... ...
我想创建一个名为RCA的列,如果(empPeople/TotalEmpRegion)/(totalEmpActivity/totalEmp)>1,则该列取值为1,否则为0。然后我将转换这个df为透视表(pivot table),索引(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')

问题在于apply函数需要太长时间(6047秒)。我想知道是否有更快的方法来完成这个任务?

函数中的 emp 是什么?是标量吗? - jezrael
emp是该地区和行业(活动)中雇用的人数。它是一个数字。 - Daulet Karim
1个回答

1

相反,您的函数应使用GroupBy.transformsum一起,并在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接