这是一个相当微不足道的问题,但它触发了我的强迫症,而且我在过去半小时内找不到合适的解决方案。
对于背景,我希望为DataFrame中的每个组计算一个值(我们称之为F),该值来自现有DataFrame中不同列聚合度量值。
以下是我正在尝试做的一个玩具示例:
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
移动到命名函数或在运行最后一行后重命名列的情况下执行此操作?
答案 0 :(得分:24)
让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
答案 1 :(得分:12)
您可以使用series
将dataframe
转换为reset_index()
并提供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