Groupby和命名聚合| 优化熊猫中的数据帧生成

车莫雷诺

我在Pandas中有一个带有某些列的数据框,如下所示:

data = {
    'CODIGO_SINIESTRO': [10476434, 10476434, 4482524, 4482524, 4486110],
    'CONDICION': ['PASAJERO', 'CONDUCTOR', 'MOTOCICLISTA', 'CICLISTA', 'PEATON'],
    'EDAD': [62.0, 29.0, 26.0, 47.0, 33.0],
    'SEXO': ['MASCULINO', 'FEMENINO', 'FEMENINO', 'MASCULINO', 'FEMENINO']
}

df = pd.DataFrame(data)

输出:

    CODIGO_SINIESTRO    CONDICION       EDAD    SEXO
0   10476434            PASAJERO        62.0    MASCULINO
1   10476434            CONDUCTOR       29.0    MASCULINO
2   4482524             MOTOCICLISTA    26.0    MASCULINO
3   4482524             CICLISTA        47.0    MASCULINO
4   4486110             PEATON          33.0    FEMENINO

因此,我想创建另一个按'CODIGO_SINIESTRO'分组的数据框,并且希望以下列类似于result:

  • 'CODIGO_SINIESTRO':该行的ID。
  • 'PROMEDIO_EDAD':此列将存储edad平均值。
  • 'CANTIDAD_HOMBRES':此列将存储基于该列的男性计数'SEXO'
  • 'CANTIDAD_HOMBRES':此列将根据'SEXO'存储女性素计数

最后,我想要五个额外的列,其名称等于'CONDICION'column的四个可能值,如果值存在,则此值将存储1,否则将存储0。

因此,我编写了此解决方案并按预期工作,但是我的数据集中有很多行(150k +),解决方案很慢(5分钟)。这是我的代码:

df_final = df.groupby(['CODIGO_SINIESTRO']).agg(
    CANTIDAD_HOMBRES=pd.NamedAgg(column='SEXO', aggfunc=lambda x: (x=='MASCULINO').sum()),
    CANTIDAD_MUJERES=pd.NamedAgg(column='SEXO', aggfunc=lambda x: (x=='FEMENINO').sum()),
    PROMEDIO_EDAD=pd.NamedAgg(column='EDAD', aggfunc=np.mean),
    MOTOCICLISTA=pd.NamedAgg(column='CONDICION', aggfunc=lambda x: (x=='MOTOCICLISTA').any().astype(int)),
    CONDUCTOR=pd.NamedAgg(column='CONDICION', aggfunc=lambda x: (x=='CONDUCTOR').any().astype(int)),
    PEATON=pd.NamedAgg(column='CONDICION', aggfunc=lambda x: (x=='PEATON').any().astype(int)),
    CICLISTA=pd.NamedAgg(column='CONDICION', aggfunc=lambda x: (x=='CICLISTA').any().astype(int)),
    PASAJERO=pd.NamedAgg(column='CONDICION', aggfunc=lambda x: (x=='PASAJERO').any().astype(int))
).reset_index()

输出:

    CODIGO_SINIESTRO    CANTIDAD_HOMBRES    CANTIDAD_MUJERES    PROMEDIO_EDAD ...    
                                                    
 0    4482524                  1                      1               36.5  
 1    4486110                  0                      1               33.0  
 2    10476434                 1                      1               45.5


... MOTOCICLISTA    CONDUCTOR   PEATON  CICLISTA    PASAJERO
        1               0         0        1           0
        0               0         1        0           0
        0               1         0        0           1

我如何优化此解决方案?,还有其他解决方法吗?

谢谢。

戴维·埃里克森

使用矢量化方法进行预聚合应该更加高效(事实证明,速度要快100倍):

df['PROMEDIO_EDAD']= df.groupby('CODIGO_SINIESTRO')['EDAD'].transform(np.mean)
df['CANTIDAD_HOMBRES'] = np.where(df['SEXO'] == 'MASCULINO', 1, 0)
df['CANTIDAD_MUJERES'] = np.where(df['SEXO'] == 'FEMENINO', 1, 0)
for col in df['CONDICION'].unique():
    df[col] = np.where(df['CONDICION'] == col, 1, 0)
df = df.groupby(['CODIGO_SINIESTRO', 'PROMEDIO_EDAD']).sum().reset_index().drop('EDAD', axis=1)
df.iloc[:,2:] = (df.iloc[:,2:] > 0).astype(int)
df
Out[1]: 
   CODIGO_SINIESTRO  PROMEDIO_EDAD  CANTIDAD_HOMBRES  CANTIDAD_MUJERES  \
0           4482524           36.5                 1                 1   
1           4486110           33.0                 0                 1   
2          10476434           45.5                 1                 1   

   PASAJERO  CONDUCTOR  MOTOCICLISTA  CICLISTA  PEATON  
0         0          0             1         1       0  
1         0          0             0         0       1  
2         1          1             0         0       0  

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用熊猫数据帧如何聚合和GROUPBY和非聚集/ GROUPBY列带来

熊猫数据帧中的行明智排序和聚合

在多索引数据帧熊猫中聚合

Scala中的嵌套GroupBy和聚合

使用 groupby 在多个键上聚合 R 中不同函数的多个列:R 中的命名聚合

聚合几个熊猫数据帧

通过熊猫中的字符串列聚合数据帧

在python中,如何使用循环命名熊猫数据帧?

在Python中的熊猫数据帧上从groupby选择索引值

如何从groupby数据帧熊猫中获取索引列表

熊猫:groupby和聚合,而不会丢失被分组的列

在 Scala/Spark 数据集/数据帧中的 groupBy 之后同时计算聚合和百分比

如何在SQL中生成键和聚合groupby函数

使用Pandas GroupBy和size()/ count()生成聚合的DataFrame

熊猫数据帧中的groupby加权平均值和总和

优化groupby聚合pandas

JAVA spark数据集中的GroupBy和聚合函数

如何聚合,结合数据框和Pandas Groupby

Pandas 数据框,groupBy 聚合多列和多行

累积熊猫数据帧/时间序列中的入口和出口

Pandas 中 groupby 和聚合的更快解决方案

Spark 数据帧 groupBy 和基于列值的进一步求和聚合

Spark 数据帧 groupBy 和进一步计数聚合

在熊猫数据帧上同时运行groupby和resample?

在熊猫中执行聚合和重命名操作的惯用方式是什么

在熊猫数据框中使用groupby和聚合时,如何从另一列连接日期

使用来自另一个数据帧的条件填充和生成熊猫数据帧

如何在 Pandas 中合并 itertools 生成的数据帧和普通数据帧?

熊猫groupby从父数据帧继承组?