佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Python pandas軸旋轉(zhuǎn)stack和unstack的使用說明

Python pandas軸旋轉(zhuǎn)stack和unstack的使用說明

熱門標(biāo)簽:硅谷的囚徒呼叫中心 Win7旗艦版 百度AI接口 電話運(yùn)營中心 企業(yè)做大做強(qiáng) 呼叫中心市場需求 語音系統(tǒng) 客戶服務(wù)

摘要

前面給大家分享了pandas做數(shù)據(jù)合并的兩篇[pandas.merge]和[pandas.cancat]的用法。今天這篇主要講的是pandas的DataFrame的軸旋轉(zhuǎn)操作,stack和unstack的用法。

首先,要知道以下五點(diǎn):

1.stack:將數(shù)據(jù)的列“旋轉(zhuǎn)”為行

2.unstack:將數(shù)據(jù)的行“旋轉(zhuǎn)”為列

3.stack和unstack默認(rèn)操作為最內(nèi)層

4.stack和unstack默認(rèn)旋轉(zhuǎn)軸的級別將會成果結(jié)果中的最低級別(最內(nèi)層)

5.stack和unstack為一組逆運(yùn)算操作

第一點(diǎn)和第二點(diǎn)以及第五點(diǎn)比較好懂,可能乍看第三點(diǎn)和第四點(diǎn)會不太理解,沒關(guān)系,看看具體下面的例子,你就懂了。

1、創(chuàng)建DataFrame,行索引名為state,列索引名為number

import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(6).reshape((2,3)),index=pd.Index(['Ohio','Colorado'],name='state')
     ,columns=pd.Index(['one','two','three'],name='number'))
data

2、將DataFrame的列旋轉(zhuǎn)為行,即stack操作

result = data.stack()
result

從下圖中結(jié)果來理解上述點(diǎn)4,stack操作后將列索引number旋轉(zhuǎn)為行索引,并且置于行索引的最內(nèi)層(外層為索引state),也就是將旋轉(zhuǎn)軸(number)的結(jié)果置于 最低級別。

3、將DataFrame的行旋轉(zhuǎn)為列,即unstack操作

result.unstack()

從下面結(jié)果理解上述點(diǎn)3,unstack操作默認(rèn)將內(nèi)層索引number旋轉(zhuǎn)為列索引。

同時(shí),也可以指定分層級別或者索引名稱來指定操作級別,下面做錯(cuò)同樣會得到上面的結(jié)果。

4、stack和unstack逆運(yùn)算

s1 = pd.Series([0,1,2,3],index=list('abcd'))
s2 = pd.Series([4,5,6],index=list('cde'))
data2 = pd.concat([s1,s2],keys=['one','two'])
data2

data2.unstack().stack()

補(bǔ)充:使用Pivot、Pivot_Table、Stack和Unstack等方法在Pandas中對數(shù)據(jù)變形(重塑)

Pandas是著名的Python數(shù)據(jù)分析包,這使它更容易讀取和轉(zhuǎn)換數(shù)據(jù)。在Pandas中數(shù)據(jù)變形意味著轉(zhuǎn)換表或向量(即DataFrame或Series)的結(jié)構(gòu),使其進(jìn)一步適合做其他分析。在本文中,小編將舉例說明最常見的一些Pandas重塑功能。

一、Pivot

pivot函數(shù)用于從給定的表中創(chuàng)建出新的派生表,pivot有三個(gè)參數(shù):索引、列和值。具體如下:

def pivot_simple(index, columns, values):
  """
  Produce 'pivot' table based on 3 columns of this DataFrame.
  Uses unique values from index / columns and fills with values.
  Parameters
  ----------
  index : ndarray
    Labels to use to make new frame's index
  columns : ndarray
    Labels to use to make new frame's columns
  values : ndarray
    Values to use for populating new frame's values

作為這些參數(shù)的值需要事先在原始的表中指定好對應(yīng)的列名。然后,pivot函數(shù)將創(chuàng)建一個(gè)新表,其行和列索引是相應(yīng)參數(shù)的唯一值。我們一起來看一下下面這個(gè)例子:

假設(shè)我們有以下數(shù)據(jù):

我們將數(shù)據(jù)讀取進(jìn)來:

from collections import OrderedDict
from pandas import DataFrame
import pandas as pd
import numpy as np
 
data = OrderedDict((
  ("item", ['Item1', 'Item1', 'Item2', 'Item2']),
  ('color', ['red', 'blue', 'red', 'black']),
  ('user', ['1', '2', '3', '4']),
  ('bm',  ['1', '2', '3', '4'])
))
data = DataFrame(data)
print(data)

得到結(jié)果為:

  item color user bm
0 Item1  red  1 1
1 Item1  blue  2 2
2 Item2  red  3 3
3 Item2 black  4 4

接下來,我們對以上數(shù)據(jù)進(jìn)行變形:

df = data.pivot(index='item', columns='color', values='user')
print(df)

得到的結(jié)果為:

color black blue red
item         
Item1 None   2  1
Item2   4 None  3

注意:可以使用以下方法對原始數(shù)據(jù)和轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行等效查詢:

# 原始數(shù)據(jù)集
print(data[(data.item=='Item1')  (data.color=='red')].user.values)
 
# 變換后的數(shù)據(jù)集
print(df[df.index=='Item1'].red.values)

結(jié)果為:

['1']
['1']

在以上的示例中,轉(zhuǎn)化后的數(shù)據(jù)不包含bm的信息,它僅包含我們在pivot方法中指定列的信息。下面我們對上面的例子進(jìn)行擴(kuò)展,使其在包含user信息的同時(shí)也包含bm信息。

df2 = data.pivot(index='item', columns='color')
print(df2)

結(jié)果為:

    user       bm     
color black blue red black blue red
item                 
Item1 None   2  1 None   2  1
Item2   4 None  3   4 None  3

從結(jié)果中我們可以看出:Pandas為新表創(chuàng)建了分層列索引。我們可以用這些分層列索引來過濾出單個(gè)列的值,例如:使用df2.user可以得到user列中的值。

二、Pivot Table

有如下例子:

data = OrderedDict((
  ("item", ['Item1', 'Item1', 'Item1', 'Item2']),
  ('color', ['red', 'blue', 'red', 'black']),
  ('user', ['1', '2', '3', '4']),
  ('bm',  ['1', '2', '3', '4'])
))
data = DataFrame(data) 
df = data.pivot(index='item', columns='color', values='user')

得到的結(jié)果為:

ValueError: Index contains duplicate entries, cannot reshape

因此,在調(diào)用pivot函數(shù)之前,我們必須確保我們指定的列和行沒有重復(fù)的數(shù)據(jù)。如果我們無法確保這一點(diǎn),我們可以使用pivot_table這個(gè)方法。

pivot_table方法實(shí)現(xiàn)了類似pivot方法的功能,它可以在指定的列和行有重復(fù)的情況下使用,我們可以使用均值、中值或其他的聚合函數(shù)來計(jì)算重復(fù)條目中的單個(gè)值。

首先,我們先來看一下pivot_table()這個(gè)方法:

def pivot_table(data, values=None, index=None, columns=None, aggfunc='mean',
        fill_value=None, margins=False, dropna=True,
        margins_name='All'):
  """
  Create a spreadsheet-style pivot table as a DataFrame. The levels in the
  pivot table will be stored in MultiIndex objects (hierarchical indexes) on
  the index and columns of the result DataFrame
  Parameters
  ----------
  data : DataFrame
  values : column to aggregate, optional
  index : column, Grouper, array, or list of the previous
    If an array is passed, it must be the same length as the data. The list
    can contain any of the other types (except list).
    Keys to group by on the pivot table index. If an array is passed, it
    is being used as the same manner as column values.
  columns : column, Grouper, array, or list of the previous
    If an array is passed, it must be the same length as the data. The list
    can contain any of the other types (except list).
    Keys to group by on the pivot table column. If an array is passed, it
    is being used as the same manner as column values.
  aggfunc : function or list of functions, default numpy.mean
    If list of functions passed, the resulting pivot table will have
    hierarchical columns whose top level are the function names (inferred
    from the function objects themselves)
  fill_value : scalar, default None
    Value to replace missing values with
  margins : boolean, default False
    Add all row / columns (e.g. for subtotal / grand totals)
  dropna : boolean, default True
    Do not include columns whose entries are all NaN
  margins_name : string, default 'All'
    Name of the row / column that will contain the totals
    when margins is True.
    接下來我們來看一個(gè)示例:
data = OrderedDict((
  ("item", ['Item1', 'Item1', 'Item1', 'Item2']),
  ('color', ['red', 'blue', 'red', 'black']),
  ('user', ['1', '2', '3', '4']),
  ('bm',  ['1', '2', '3', '4'])
))
data = DataFrame(data)
 
df = data.pivot_table(index='item', columns='color', values='user', aggfunc=np.min)
print(df)

結(jié)果為:

color black blue  red
item          
Item1 None   2   1
Item2   4 None None

實(shí)際上,pivot_table()是pivot()的泛化,它允許在數(shù)據(jù)集中聚合具有相同目標(biāo)的多個(gè)值。

三、Stack/Unstack

事實(shí)上,變換一個(gè)表只是堆疊DataFrame的一種特殊情況,假設(shè)我們有一個(gè)在行列上有多個(gè)索引的DataFrame。堆疊DataFrame意味著移動最里面的列索引成為最里面的行索引,反向操作稱之為取消堆疊,意味著將最里面的行索引移動為最里面的列索引。例如:

from pandas import DataFrame
import pandas as pd
import numpy as np
 
# 建立多個(gè)行索引
row_idx_arr = list(zip(['r0', 'r0'], ['r-00', 'r-01']))
row_idx = pd.MultiIndex.from_tuples(row_idx_arr)
 
# 建立多個(gè)列索引
col_idx_arr = list(zip(['c0', 'c0', 'c1'], ['c-00', 'c-01', 'c-10']))
col_idx = pd.MultiIndex.from_tuples(col_idx_arr)
 
# 創(chuàng)建DataFrame
d = DataFrame(np.arange(6).reshape(2,3), index=row_idx, columns=col_idx)
d = d.applymap(lambda x: (x // 3, x % 3))
 
# Stack/Unstack
s = d.stack()
u = d.unstack()
print(s)
print(u)

得到的結(jié)果為:

         c0   c1
r0 r-00 c-00 (0, 0)   NaN
    c-01 (0, 1)   NaN
    c-10   NaN (0, 2)
  r-01 c-00 (1, 0)   NaN
    c-01 (1, 1)   NaN
    c-10   NaN (1, 2)
 
    c0               c1    
   c-00      c-01      c-10    
   r-00  r-01  r-00  r-01  r-00  r-01
r0 (0, 0) (1, 0) (0, 1) (1, 1) (0, 2) (1, 2)

實(shí)際上,Pandas允許我們在索引的任何級別上堆疊/取消堆疊。 因此,在前面的示例中,我們也可以堆疊在最外層的索引級別上。 但是,默認(rèn)(最典型的情況)是在最里面的索引級別進(jìn)行堆疊/取消堆疊。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Python Pandas知識點(diǎn)之缺失值處理詳解
  • Python基礎(chǔ)之教你怎么在M1系統(tǒng)上使用pandas
  • Python基礎(chǔ)之pandas數(shù)據(jù)合并
  • python-pandas創(chuàng)建Series數(shù)據(jù)類型的操作
  • Python數(shù)據(jù)分析之pandas函數(shù)詳解
  • python基于Pandas讀寫MySQL數(shù)據(jù)庫
  • python pandas合并Sheet,處理列亂序和出現(xiàn)Unnamed列的解決
  • python 使用pandas同時(shí)對多列進(jìn)行賦值
  • python之 matplotlib和pandas繪圖教程
  • Python3 pandas.concat的用法說明
  • python pandas模糊匹配 讀取Excel后 獲取指定指標(biāo)的操作
  • 聊聊Python pandas 中l(wèi)oc函數(shù)的使用,及跟iloc的區(qū)別說明
  • python讀寫數(shù)據(jù)讀寫csv文件(pandas用法)
  • Python Pandas list列表數(shù)據(jù)列拆分成多行的方法實(shí)現(xiàn)
  • python繪圖pyecharts+pandas的使用詳解
  • Python機(jī)器學(xué)習(xí)三大件之二pandas

標(biāo)簽:長沙 崇左 海南 喀什 安康 山西 濟(jì)南 山西

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python pandas軸旋轉(zhuǎn)stack和unstack的使用說明》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    腾冲县| 夏津县| 遂川县| 固安县| 鲁山县| 玉山县| 石台县| 崇文区| 淅川县| 宝山区| 藁城市| 信宜市| 南宁市| 漳浦县| 喀什市| 措勤县| 休宁县| 西林县| 银川市| 民乐县| 金沙县| 祥云县| 安西县| 黔西| 珲春市| 灵寿县| 台州市| 临漳县| 台安县| 长海县| 安福县| 印江| 南昌市| 张家港市| 桐柏县| 龙泉市| 蒲江县| 南和县| 和平区| 黄冈市| 铁力市|