使用Pandas按账号条件将服务日期追加至对应行尾部
解决方法
别用嵌套循环处理,效率低还容易出错,直接用pandas内置函数就能搞定:
- 给每个账户的服务日期添加组内序号
先按Account Number分组,给每个组里的DOS按顺序标记序号(第1个日期标记为1,第2个为2,以此类推):
df['date_idx'] = df.groupby('Account Number').cumcount() + 1
- 将数据重塑为宽表结构
用pivot方法把同一账户的不同日期转到同一行,再把列名改成Service Date 1、Service Date 2的格式:
final_df = df.pivot(index='Account Number', columns='date_idx', values='DOS') final_df.columns = [f'Service Date {col}' for col in final_df.columns] final_df = final_df.reset_index().rename(columns={'Account Number': 'Account'})
如果原始数据还有其他关联列(比如姓名、消费金额等),可以把这些列和Account Number一起作为索引,避免丢失信息:
# 假设还有其他列如'Name' final_df = df.pivot(index=['Account Number', 'Name'], columns='date_idx', values='DOS') final_df.columns = [f'Service Date {col}' for col in final_df.columns] final_df = final_df.reset_index()
原代码的问题
- 未初始化
x,且x是全局累加,不是按每个账户单独计数,导致列名序号混乱。 final[service_date] = df['DOS']是把整个DOS列赋值给新列,而非当前匹配账户对应的单个日期,所以每个新列都会包含所有日期,不符合需求。
内容的提问来源于stack exchange,提问作者Ceci V
相关产品推荐
相关产品推荐

