【Python私活案例】100元:Pandas實(shí)現(xiàn)Excel表格轉(zhuǎn)換
一早起床發(fā)現(xiàn)Python的學(xué)習(xí)群里居然還有一個(gè)懸賞需求沒人接單,還等什么趕緊接單賺頓星爸爸早餐。
需求分析
根據(jù)需求,最終需要轉(zhuǎn)換的表格結(jié)果是一個(gè)按日期、分等級(jí)的次數(shù)統(tǒng)計(jì)結(jié)果,如果把左側(cè)的原始表格轉(zhuǎn)換為按日期、按等級(jí)記錄的流水表格,那只要一次透視就可以得到最終結(jié)果。因此,思路最終就是將原始表格轉(zhuǎn)為長表格式,后進(jìn)行透視處理。(嗯,在星爸爸的早餐召喚下,我的思路就是這么清晰?。?/p>
二話不說擼代碼
import pandas as pd
# 讀取原始數(shù)據(jù)表格
df = pd.read_excel('d:/test/需求.xlsx')
# 根據(jù)等級(jí)規(guī)則,構(gòu)建一個(gè)字典用于后續(xù)轉(zhuǎn)換
level_dict = {
1: ['等級(jí)1'],
2: ['等級(jí)1', '等級(jí)2'],
3: ['等級(jí)1', '等級(jí)3'],
4: ['等級(jí)1', '等級(jí)2', '等級(jí)4'],
5: ['等級(jí)1', '等級(jí)2', '等級(jí)5']
}
# 將等級(jí)轉(zhuǎn)換list格式
df['等級(jí)'] = df['等級(jí)'].map(lambda x: level_dict.get(x))
# 新增日期列,將開始時(shí)間至結(jié)束時(shí)間轉(zhuǎn)換為連續(xù)的日期
df['日期'] = df.apply(
lambda x: pd.date_range(x['開始時(shí)間'], x['結(jié)束時(shí)間']),
axis=1
)
# 將df的等級(jí)、日期列拆分為多行格式
df = df.explode('等級(jí)').explode('日期')
# 進(jìn)行透視得到結(jié)果
df = df.pivot_table(
index='日期', # 日期作為索引
columns='等級(jí)', # 等級(jí)作為列
values='開始時(shí)間', # 開始時(shí)間作為計(jì)數(shù)列(隨意選擇非空列即可)
aggfunc='count', # 聚合函數(shù)為count計(jì)數(shù)
fill_value=0 # 空值使用0填充
)
空腹?fàn)顟B(tài)下,腦部供血充足,手速極快,三分鐘搞定代碼~~~
過程校驗(yàn)與展示:
1讀取原始數(shù)據(jù)

2將等級(jí)轉(zhuǎn)換為list格式

3添加新的日期列,為一個(gè)連續(xù)的日期區(qū)間
這個(gè)步驟感謝一下群友“物品0791”的優(yōu)化,使代碼更加簡潔了。
4一行拆分成多行
這個(gè)步驟是最關(guān)鍵的環(huán)節(jié),將表格變?yōu)殚L表后,后續(xù)進(jìn)行透視就是非常簡單的步驟了。
5使用pivot_table進(jìn)行表透視得到結(jié)果

最后展示一下和甲方的交付(錢不在多,貴在獲得肯定)

錢錢到手,可以去浪了^_^~~~
最后,推薦螞蟻老師的《Python實(shí)現(xiàn)Excel辦公自動(dòng)化》課程
購買課程后可以加螞蟻老師微信ant_learn_python入群,群快滿500人了??!
附注:100元 = 私活需求50元+投稿給螞蟻老師稿費(fèi)50元
閱讀原文,也可以達(dá)到課程頁面
評(píng)論
圖片
表情
