Loading...
墨滴

小林1025

2021/11/14  阅读:126  主题:默认主题

【Python私活案例】数据表格转换需求

群友需求

转换表格的具体需求
转换表格的具体需求

理一下思路

根据需求,最终需要转换的表格结果是一个按日期、分等级的次数统计结果,如果把左侧的原始表格转换为按日期、按等级记录的流水表格,那只要一次透视就可以得到最终结果。 因此,目标将原始表格转为长表格式。

代码实现

import pandas as pd
from datetime import timedelta

# 读取原始数据表格
df = pd.read_excel('d:/test/需求.xlsx')
# 根据等级规则,构建一个字典用于后续转换
level_dict = {
    1: ['等级1'],
    2: ['等级1''等级2'],
    3: ['等级1''等级3'],
    4: ['等级1''等级2''等级4'],
    5: ['等级1''等级2''等级5']
}
# 将等级转换list格式
df['等级'] = df['等级'].map(lambda x: level_dict.get(x))
# 新增日期列,将开始时间至结束时间转换为连续的日期
df['日期'] = df.apply(
    lambda x: [x['开始时间'] + timedelta(y) for y in range((x['结束时间'] - x['开始时间']).days + 1)],
    axis=1
)
# 将df的等级、日期列拆分为多行格式
df = df.explode('等级').explode('日期')
# 进行透视得到结果
df = df.pivot_table(
    index='日期',   # 日期作为索引
    columns='等级',   # 等级作为列
    values='开始时间',   # 开始时间作为计数列(随意选择非空列即可)
    aggfunc='count',   # 聚合函数为count计数
    fill_value=0  # 空值使用0填充
)

过程展示:

1读取原始数据
1读取原始数据
2等级转换为list
2等级转换为list
3添加新列连续的日期
3添加新列连续的日期
4一行拆分成多行
4一行拆分成多行
5透视得到结果表
5透视得到结果表

小林1025

2021/11/14  阅读:126  主题:默认主题

作者介绍

小林1025