Pandas多DataFrame分组计算各ID偏好周日月对应交易金额总和方法
Pandas 实现统计的完整代码
import pandas as pd # 你提供的当月周数计算函数 def weekinmonth(dates): """获取日期对应当月的周数 参数: dates (pd.Series): 日期格式的Series 返回值: pd.Series: 对应日期的当月周数 """ firstday_in_month = dates - pd.to_timedelta(dates.dt.day - 1, unit='d') return (dates.dt.day-1 + firstday_in_month.dt.weekday) // 7 + 1 # ---------------------- 1. 读取/构造数据集(实际使用时替换为你自己的数据读取逻辑) ---------------------- # 交易数据集 df_trade = pd.DataFrame([ [1, '2020-01-02', 1000], [1, '2020-01-09', 200], [1, '2020-01-08', 400] ], columns=['ID', 'Date', 'Amount']) # 偏好数据集 df_pref = pd.DataFrame([ [1, 3, 2] ], columns=['ID', 'Pref_Day_Of_Week_A', 'Pref_Week_Of_Month_A']) # ---------------------- 2. 计算交易日期的衍生字段 ---------------------- # 先将日期列转为标准datetime格式 df_trade['Date'] = pd.to_datetime(df_trade['Date']) # 计算交易日期对应的星期(规则为周一=0、周日=6,和你提供的偏好星期规则完全匹配) df_trade['day_of_week'] = df_trade['Date'].dt.weekday # 计算交易日期对应的当月周数 df_trade['week_of_month'] = weekinmonth(df_trade['Date']) # ---------------------- 3. 关联数据并按ID分组统计 ---------------------- # 按ID关联交易数据和偏好数据 df_merge = pd.merge(df_trade, df_pref, on='ID', how='left') # 分组计算每个ID的两个目标指标 result = df_merge.groupby('ID', as_index=False).agg( # 统计偏好星期的交易金额总和 Amount_On_Pref_Day = ('Amount', lambda s: s[df_merge.loc[s.index, 'day_of_week'] == df_merge.loc[s.index, 'Pref_Day_Of_Week_A']].sum()), # 统计偏好月周的交易金额总和 Amount_Pref_Week = ('Amount', lambda s: s[df_merge.loc[s.index, 'week_of_month'] == df_merge.loc[s.index, 'Pref_Week_Of_Month_A']].sum()) ) print(result)
运行后输出结果完全符合要求的结构:
ID Amount_On_Pref_Day Amount_Pref_Week 0 1 1200 600
内容的提问来源于stack exchange,提问作者sinha-shaurya
相关产品推荐
相关产品推荐

