源于群管理員林胖發(fā)出的一道基礎(chǔ)題: 文章目錄基礎(chǔ)解法explode函數(shù)這道題最簡單的解法,相信大部分用過pandas的朋友都會(huì),林胖也馬上發(fā)出了自己的答案:
結(jié)果: 詳解
返回:
將這個(gè)內(nèi)部是元組的可迭代對(duì)象傳入DataFrame的構(gòu)造函數(shù)中:
返回結(jié)果: 這是pandas最基礎(chǔ)的開篇知識(shí)點(diǎn)使用可迭代對(duì)象構(gòu)造DataFrame,列表的每個(gè)元素都是整個(gè)DataFrame對(duì)應(yīng)的一行,而這個(gè)元素內(nèi)部迭代出來的每個(gè)元素將構(gòu)成DataFrame的某一列。 然后再看看這個(gè)explode函數(shù),它是pandas 0.25版本才出現(xiàn)的函數(shù),只有一個(gè)參數(shù)可以傳入列名,然后該函數(shù)就可以把該列的列表每個(gè)元素?cái)U(kuò)展到多行上。 效果與hive使用lateral view+explode實(shí)現(xiàn)的效果幾乎一致,類似于:
可以參考很早之前的一篇文章:https://blog.csdn.net/as604049322/article/details/105985770 沒有exlode函數(shù)如何解決這個(gè)問題但是,黃佬說版本太低沒有這個(gè)函數(shù),于是我給群友們出了一道題: 在群主的邀請(qǐng)下,一位經(jīng)過我多次輔導(dǎo)的群友率先使用了循環(huán)法解題: 我覺得非常棒,但我也希望看到有人再用變形法實(shí)現(xiàn)一次。林胖和一位群友再次給出了簡化版本的循環(huán)解法: 經(jīng)過一番提示后,小五哥和林胖終于給出了變形法的解法: 非常不錯(cuò),群友們終于獨(dú)立的多思路解決了這個(gè)問題,真的要撒花呀!!! 下面我們?cè)敿?xì)分析一下,循環(huán)法和變形法的解法吧: 循環(huán)法解題基本寫法:
本質(zhì)上就是實(shí)現(xiàn)了一個(gè)笛卡爾積的拉平操作,將 上面的基本寫法,應(yīng)該99%以上的朋友都能看懂,但 林胖 的循環(huán)簡化解法:
部分朋友可能沒有看明白,這個(gè)就需要查詢一下product方法的官方文檔(https://docs./zh-cn/3.7/library/itertools.html?highlight=product#itertools.product):
參數(shù):
用于生成可迭代對(duì)象輸入的笛卡兒積,相當(dāng)于生成器表達(dá)式中的嵌套循環(huán)。 例如: 返回示例:
也可以傳入可選參數(shù) repeat 表示重復(fù)的次數(shù):例如, 列表的extend方法是將可迭代對(duì)象的每個(gè)元素都添加到列表中,而append方法只能添加單個(gè)元素。 當(dāng)然,我們還可以將整個(gè)for循環(huán)改寫成列表生成式:
也可以簡化代碼量。 變形法解題
實(shí)現(xiàn)思路,上面的界面是下面最左邊: 列表分列的2種方法列表分列的思路:Pandas的Series對(duì)象調(diào)用apply方法單個(gè)元素返回的結(jié)果是Series時(shí),這個(gè)Series的每個(gè)數(shù)據(jù)會(huì)作為Datafrem的每一列,索引會(huì)作為列名。 對(duì)Series進(jìn)行列表分列 例如:
結(jié)果: 不過這樣會(huì)丟失原本的"a"列,我們可以先將"a"列設(shè)置為索引,再進(jìn)行Series分列操作:
或者把結(jié)果設(shè)置成原本的"a"列為索引:
結(jié)果均為上述實(shí)現(xiàn)思路的第二步。 直接對(duì)Datafream進(jìn)行列表分列 如果我們希望直接使用Datafream實(shí)現(xiàn)分列可以借助agg方法,因?yàn)閍gg方法是對(duì)每一列的Series對(duì)象操作:
結(jié)果: 但這操作導(dǎo)致列多了一個(gè)級(jí)別,需要?jiǎng)h除:
結(jié)果: 只要再執(zhí)行
結(jié)果就會(huì)與實(shí)現(xiàn)思路的第二步結(jié)果一致。 將字典的鍵作為索引的2種讀取方法當(dāng)然上面我只是為了給大家講述分列的一些方法。對(duì)于這個(gè)例子,其實(shí)我們可以直接通過
或者分別傳入data和索引index:
都能得到以下結(jié)果: melt實(shí)現(xiàn)逆透視說起逆透視我個(gè)人首先想到了 為了避免索引丟失,我們首先還原索引為普通的列:
結(jié)果: 然后使用
結(jié)果: 然后刪除第二列,再刪除空值行,再將數(shù)值列轉(zhuǎn)換為整數(shù)類型就搞定。 最終代碼:
成功得到結(jié)果: stack實(shí)現(xiàn)逆透視
結(jié)果:
結(jié)果返回了一個(gè)多級(jí)索引的Series,我們首先需要?jiǎng)h除索引中多余的部分:
結(jié)果:
此時(shí)我們?cè)龠€原索引到普通列:
再重新設(shè)置一下列名:
最后重設(shè)一下B列的類型:
最終代碼:
結(jié)果: |
|