如何将Python中计算产品平均购买者年龄的两个函数简化为一个?
问题
现有如下格式的数据:
product|birth-date|id| etc. etc. _____________________ tv | 01-01-2000|1|... book | 30-04-1980|2|...
我希望创建一个函数,按购买者的平均年龄对产品类型进行排序,并返回包含这两列的新DataFrame。请问是否可以将现有的两个函数简化为一个?
用于生成年龄列的第一个函数:
from datetime import date import pandas as pd def age(df): today = date.today() return today.year - df.year - ((today.month, today.day) < (df.month, df.day)) df['age'] = pd.to_datetime(df.birth_date) df['age'] = df['age'].apply(lambda x: age(x)) df['age'] = df['age'].astype('int')
用于创建排序后新DataFrame的第二个函数:
def create_new_df(df): data= df.groupby(['product'])['age'].mean() new_df = pd.DataFrame(data) return new_df create_new_df(df)
解答
当然可以将两个函数简化为一个,以下是两种简洁的实现方式:
方式一:整合逻辑并保留临时年龄列
这种方式逻辑清晰,先计算年龄再分组排序,适合需要保留年龄列的场景:
from datetime import date import pandas as pd def get_sorted_product_avg_age(df): today = date.today() # 将出生日期转为datetime并计算年龄 df['age'] = pd.to_datetime(df['birth-date']).apply( lambda x: today.year - x.year - ((today.month, today.day) < (x.month, x.day)) ).astype(int) # 按产品分组求平均年龄,排序后转为DataFrame result = df.groupby('product')['age'].mean().sort_values(ascending=False).reset_index() # 重命名列名提升可读性 result.columns = ['product', 'average_age'] return result
方式二:无临时列的优化实现
如果不需要保留原DataFrame的年龄列,可以直接在分组时计算平均年龄,避免修改原数据:
from datetime import date import pandas as pd def get_sorted_product_avg_age(df): today = date.today() # 直接对分组后的出生日期计算平均年龄,无需临时列 result = df.groupby('product')['birth-date'].apply( lambda x: (today.year - pd.to_datetime(x).dt.year - ((today.month, today.day) < (pd.to_datetime(x).dt.month, pd.to_datetime(x).dt.day))).mean() ).sort_values(ascending=False).reset_index() # 设置列名并格式化数据类型 result.columns = ['product', 'average_age'] return result.astype({'average_age': float})
说明
- 两种方式都完成了计算购买者年龄、按产品分组求平均年龄、按平均年龄排序的完整逻辑
- 方式二不会修改原DataFrame,也无需创建临时的
age列,内存使用更高效 sort_values(ascending=False)表示按平均年龄降序排序,若需要升序可改为ascending=True
内容的提问来源于stack exchange,提问作者Pixel
相关产品推荐
相关产品推荐

