這個(gè)函數(shù),我感覺類似列轉(zhuǎn)行,有點(diǎn)意思
成都創(chuàng)新互聯(lián)公司于2013年成立,先為聶榮等服務(wù)建站,聶榮等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為聶榮企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
metl 函數(shù)和 pivot 函數(shù)有些類似,是一個(gè)逆過程
pandas.melt(frame: pandas.core.frame.DataFrame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None) → pandas.core.frame.DataFrame
Unpivot a DataFrame from wide to long format, optionally leaving identifiers set.
這是我們的原始數(shù)據(jù)
下面,我們使用 melt 函數(shù)轉(zhuǎn)換一下
這個(gè) melt 函數(shù),是針對列來說的,所以這個(gè) id_vars 參數(shù),表示作為固定列(標(biāo)識符)
這里我們指定為A,所以A列保持不變,而B列和C列都被拆到了行中
好好理解一下,這個(gè)函數(shù)道理實(shí)現(xiàn)了一個(gè)什么功能,就知道咋用了
默認(rèn)的列名是variable和value,而我們也可以手動指定
上面,我們使用了id_vars,表示不變的列,而value_vars就表示需要拆分的列,默認(rèn)的話其余列都會拆分,我們也可以手工選定
這里相當(dāng)于,只對B列做了轉(zhuǎn)化,而忽略(不要了)C列
1.長寬表的變形
什么是長表?什么是寬表?這個(gè)概念是對于某一個(gè)特征而言的。例如:一個(gè)表中把性別存儲在某一個(gè)列中, 那么它就是關(guān)于性別的長表;如果把性別作為列名,列中的元素是某一其他的相關(guān)特征數(shù)值,那么這個(gè)表是 關(guān)于性別的寬表。
1.1 pivot
pivot 是一種典型的長表變寬表的函數(shù)。對于一個(gè)基本的長變寬的操作而言,最重要的有三個(gè)要素,分別是變形后的行索引、需要轉(zhuǎn)到列索引的列, 以及這些列和行索引對應(yīng)的數(shù)值,它們分別對應(yīng)了 pivot 方法中的 index, columns, values 參數(shù)。新生成表的 列索引是 columns 對應(yīng)列的 unique 值,而新表的行索引是 index 對應(yīng)列的 unique 值,而 values 對應(yīng)了想 要展示的數(shù)值列。
利用 pivot 進(jìn)行變形操作需要滿足唯一性的要求,即由于在新表中的行列索引對應(yīng)了唯一的 value ,因此原 表中的 index 和 columns 對應(yīng)兩個(gè)列的行組合必須唯一。例如,現(xiàn)在把原表中第二行張三的數(shù)學(xué)改為語文就 會報(bào)錯(cuò),這是由于 Name 與 Subject 的組合中兩次出現(xiàn) (”San Zhang”, ”Chinese”) ,從而最后不能夠確定到 底變形后應(yīng)該是填寫 80 分還是 75 分。
pandas 從 1.1.0 開始,pivot 相關(guān)的三個(gè)參數(shù)允許被設(shè)置為列表,這也意味著會返回多級索引。這里構(gòu)造一 個(gè)相應(yīng)的例子來說明如何使用:下表中六列分別為班級、姓名、測試類型(期中考試和期末考試)、科目、成 績、排名。
根據(jù)唯一性原則,新表的行索引等價(jià)于對 index 中的多列使用 drop_duplicates ,而列索引的長度為 values 中的元素個(gè)數(shù)乘以 columns 的唯一組合數(shù)量(與 index 類似)。
1.2 pivot_table
pivot 的使用依賴于唯一性條件,那如果不滿足唯一性條件,那么必須通過聚合操作使得相同行列組合對應(yīng) 的多個(gè)值變?yōu)橐粋€(gè)值。例如,張三和李四都參加了兩次語文考試和數(shù)學(xué)考試,按照學(xué)院規(guī)定,最后的成績是 兩次考試分?jǐn)?shù)的平均值,此時(shí)就無法通過 pivot 函數(shù)來完成。
1.3 melt
長寬表只是數(shù)據(jù)呈現(xiàn)方式的差異,但其包含的信息量是等價(jià)的,前面提到了利用 pivot 把長表轉(zhuǎn)為寬表,那 么就可以通過相應(yīng)的逆操作把寬表轉(zhuǎn)為長表,melt 函數(shù)就起到了這樣的作用。
1.4 wide_to_long
melt 方法中,在列索引中被壓縮的一組值對應(yīng)的列元素只能代表同一層次的含義,即 values_name 。現(xiàn)在 如果列中包含了交叉類別,比如期中期末的類別和語文數(shù)學(xué)的類別,那么想要把 values_name 對應(yīng)的 Grade 擴(kuò)充為兩列分別對應(yīng)語文分?jǐn)?shù)和數(shù)學(xué)分?jǐn)?shù),只把期中期末的信息壓縮,這種需求下就要使用 wide_to_long 函數(shù)來完成。
2 索引的變形
2.1 stack 與 unstack
unstack 函數(shù)的作用是把行索引轉(zhuǎn)為列索引
unstack 的主要參數(shù)是移動的層號,默認(rèn)轉(zhuǎn)化最內(nèi)層,移動到列索引的最內(nèi)層,同時(shí)支持同時(shí)轉(zhuǎn)化多個(gè)層
類似于 pivot 中的唯一性要求,在 unstack 中必須保證 被轉(zhuǎn)為列索引的行索引層和 被保留的行索引層構(gòu)成 的組合是唯一的,例如把前兩個(gè)列索引改成相同的破壞唯一性,那么就會報(bào)錯(cuò)
與 unstack 相反,stack 的作用就是把列索引的層壓入行索引,其用法完全類似。
2.2 聚合與變形的關(guān)系
在上面介紹的所有函數(shù)中,除了帶有聚合效果的 pivot_table 以外,所有的函數(shù)在變形前后并不會帶來 values 個(gè)數(shù)的改變,只是這些值在呈現(xiàn)的形式上發(fā)生了變化。在上一章討論的分組聚合操作,由于生成了新的行列 索引,因此必然也屬于某種特殊的變形操作,但由于聚合之后把原來的多個(gè)值變?yōu)榱艘粋€(gè)值,因此 values 的 個(gè)數(shù)產(chǎn)生了變化,這也是分組聚合與變形函數(shù)的最大區(qū)別。
3 其他變形函數(shù)
3.1 crosstab
crosstab 并不是一個(gè)值得推薦使用的函數(shù),因?yàn)樗軐?shí)現(xiàn)的所有功能 pivot_table 都能完成,并且速度更快。 在默認(rèn)狀態(tài)下,crosstab 可以統(tǒng)計(jì)元素組合出現(xiàn)的頻數(shù),即 count 操作。例如統(tǒng)計(jì) learn_pandas 數(shù)據(jù)集中 學(xué)校和轉(zhuǎn)系情況對應(yīng)的頻數(shù)
3.2 explode
explode 參數(shù)能夠?qū)δ骋涣械脑剡M(jìn)行縱向的展開,被展開的單元格必須存儲 list, tuple, Series, np.ndarray 中的一種類型。
3.3 get_dummies
get_dummies 是用于特征構(gòu)建的重要函數(shù)之一,其作用是把類別特征轉(zhuǎn)為指示變量。例如,對年級一列轉(zhuǎn)為 指示變量,屬于某一個(gè)年級的對應(yīng)列標(biāo)記為 1,否則為 0
四個(gè)函數(shù)功能的簡單總結(jié)對比,stack/unstack一組,pivot/melt一組:
pivot()和melt()函數(shù)是較簡單方便的,但是它倆是依據(jù)column的值作為索引的分類,和stack/unstack在column和index之間的轉(zhuǎn)換有實(shí)質(zhì)差別。一般在轉(zhuǎn)換之后會進(jìn)行reset_index()操作。
寫的太糙了,看原始函數(shù)介紹比較好。
參見資料:
Pandas DataFrame stack 函數(shù)
Pandas DataFrame unstack 函數(shù)
Pandas DataFrame pivot 函數(shù)
Pandas DataFrame melt 函數(shù)
pandas中DataFrame的stack()、unstack()和pivot()方法的對比
目的如題目,長寬表格轉(zhuǎn)換,即長表格轉(zhuǎn)換為寬表格/寬表格轉(zhuǎn)換為長表格,采用pivot和melt函數(shù)操作。關(guān)于該方法和stack和unstack的區(qū)別可以查看 Python Pandas DataFrame stack(), unstack(), pivot(), melt()操作
原始數(shù)據(jù)如下,想要得到city作為行,indus作為列,rca作為值的矩陣,操作如下,
通用范式為 df.pivot(index='index_label', columns='column_label', values='value_label')
針對上述的df,操作如下
可以看出,最后的dataframe的列的值是原來的column的具體數(shù)值。
今日份水文完畢,主要目的是為了第一個(gè)長轉(zhuǎn)寬。