设置groupby上应用结果的列名

2024-09-27 07:31:49 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个相当小的问题,但它触发了我的强迫症,我一直未能找到一个合适的解决方案,在过去的半个小时。

在后台,我想为一个数据帧中的每个组计算一个值(我们称之为F),这个数据帧来自于现有数据帧中列的聚合度量值。

下面是一个我正在尝试的玩具示例:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': ['X', 'Y', 'X', 'Y', 'Y', 'Y', 'Y', 'X', 'Y', 'X'],
                'B': ['N', 'N', 'N', 'M', 'N', 'M', 'M', 'N', 'M', 'N'],
                'C': [69, 83, 28, 25, 11, 31, 14, 37, 14,  0],
                'D': [ 0.3,  0.1,  0.1,  0.8,  0.8,  0. ,  0.8,  0.8,  0.1,  0.8],
                'E': [11, 11, 12, 11, 11, 12, 12, 11, 12, 12]
                })

df_grp = df.groupby(['A','B'])
df_grp.apply(lambda x: x['C'].sum() * x['D'].mean() / x['E'].max())

我想做的是为apply(或lambda)的结果分配一个名称。在不将lambda移到命名函数或在运行最后一行后重命名列的情况下,是否仍要执行此操作?


Tags: 数据lambdaimportdfas解决方案后台pd
2条回答

您可以使用reset_index()series转换为dataframe,并提供name='yout_col_name'——与序列值对应的列的名称

(df_grp.apply(lambda x: x['C'].sum() * x['D'].mean() / x['E'].max())
      .reset_index(name='your_col_name'))

   A  B  your_col_name
0  X  N   5.583333
1  Y  M   2.975000
2  Y  N   3.845455

让lambda函数返回一个新序列:

df_grp.apply(lambda x: pd.Series({'new_name':
                    x['C'].sum() * x['D'].mean() / x['E'].max()}))

     new_name
A B          
X N  5.583333
Y M  2.975000
  N  3.845455

相关问题 更多 >

    热门问题