如何将data1数据逐行填充至cohort_table2对应行列并累加Closed.Won.MRR值?
问题描述
现有数据集data1包含Close.Date、Closed.Won.MRR、Sign.up.Date三列,样本数据如下:
Close.Date Closed.Won.MRR Sign.up.Date 2020-04 447.0 2020-02 2020-03 100.0 2020-02 2022-04 536.4 2022-03 2022-06 150.0 2022-03 2022-06 125.0 2022-03 2022-06 147.0 2021-10 ... ... ....
已创建空DataFrame cohort_table2,其行以Sign.up.Date的所有可能值作为Period列内容,列以Close.Date的所有可能值作为列名,初始值均为0,结构如下:
Period 2020-02 2020-03 2020-04 ... ... .. 2020-02 0 0 0 2020-03 0 0 0 2020-04 0 0 0 . . . .
需求:将data1中每条记录的Closed.Won.MRR值累加至cohort_table2对应的(Sign.up.Date行,Close.Date列)位置,处理完所有记录。例如某条记录:
Close.Date Closed.Won.MRR Sign.up.Date 2022-04 447.0 2022-04
需将447.0填入cohort_table2中Period为2022-04的行、列名为2022-04的位置;处理前两条记录后,cohort_table2结构如下:
Period 2020-02 2020-03 2020-04 ... ... .. 2020-02 0 100 447 2020-03 0 0 0 2020-04 0 0 0 . . . .
实现方案
方法1:用Pandas透视表(高效推荐)
直接用透视表聚合数据,再和空表对齐填充,避免低效的逐行循环:
import pandas as pd # 按注册日期和成交日期分组,聚合MRR求和 agg_data = data1.pivot_table( index='Sign.up.Date', columns='Close.Date', values='Closed.Won.MRR', aggfunc='sum', fill_value=0 ) # 调整索引名称匹配cohort_table2的Period列 agg_data.index.name = 'Period' # 将聚合数据填充到预先创建的cohort_table2中,自动匹配行列 cohort_table2 = agg_data.reindex_like(cohort_table2).fillna(0) # 如果cohort_table2已存在,也可以直接用update更新值 # cohort_table2.update(agg_data)
方法2:逐行遍历实现(按题目要求的方式)
如果必须按题目要求逐行遍历数据,可使用iterrows()循环:
for _, row in data1.iterrows(): sign_up = row['Sign.up.Date'] close = row['Close.Date'] mrr = row['Closed.Won.MRR'] # 累加对应位置的数值 cohort_table2.loc[sign_up, close] += mrr
注意:此方法在数据量大时效率极低,优先推荐方法1。
内容的提问来源于stack exchange,提问作者Juan Lozano
相关产品推荐
相关产品推荐

