You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:05:20