python - pandas 应用函数性能优化

标签 python pandas optimization

我有以下df

<表类="s-表"> <头> 事件 地区 员工 <正文> 12122 1101 2 23322 1233 40 22223 2323 0 ... ... ...

我想创建一个 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/

相关文章:

python - Pandas groupby 中的 as_index 是什么?

python - Pandas:重新索引 Unsorts 数据框

c++ - 处理指针时,C++ 编译器可以优化掉代码吗?

python - 在 Python 中不读取文件最后 N 行的简单方法

python - 如何在 Pandas DataFrame 中使用 inside/in 运算符?

python - Beautifulsoup 错误 'ResultSet' 对象没有属性 'findAll'

java - 使用记忆化的源和目标之间有向图中的所有非循环路径

python - Pandas 在时间序列上的切片似乎与列表切片不一致

python - 如何按条件删除列?

arrays - Julia 代码优化 : is this the time to use SIMD?