pandas mysql index_Pandas從入門到精通(3)- Pandas多級索引MultiIndex

首先了解一下什么是多級索引,以及它的作用,為什么要有這個玩意。

多級索引也稱為層次化索引(hierarchical indexing),是指數據在一個軸上(行或者列)擁有多個(兩個以上)索引級別。之所以引入多級索引,在于它可以使用戶能以低維度形式處理高維度數據。這句話可能不太好理解,下面舉個栗子:

在一張二維表格中可以方便的存儲兩個維度的數據,比如我們現在有一張高三八班的期末考試成績表,第一個維度行是某個學生各科的考試成績,另一個維度列是某一科所有學生的成績

d30fdfbeb312

image.png

現在在加入一個維度:不同的班級。即如果我們想在這張表上在加上高三七班同樣的成績該怎么操作?這時候我們就可以在行上在加入一個班級的維度,如下:

d30fdfbeb312

image.png

正常情況下,不同的班級的所有學生的成績應該是引入不同的表格來存儲,即三八班和三七班是兩張表。但是引入多級索引就可以把這兩張表整合在一起,即所謂的以低維度形式處理高維度的數據。 這種情況在每張表數據量不大或者字段不多的時候使用起來比較方便

1. 多級索引的創建

通常由兩種方式創建多級索引:

通過多級數組隱式創建

通過pd.MultiIndex顯示創建

下面分別舉例

方法1-隱式創建,即給DataFrame的index或columns參數傳遞兩個或更多的數組。

import pandas as pd

import numpy as np

from pandas import DataFrame, Series

df = DataFrame (np.random.randint ( 0 , 100 ,( 4 , 6 )),

index = ['學生' + i for i in 'ABCD'],

columns =[[ '數學' , '數學' , '語文' , '語文' , '英語' , '英語' ],

[ '期中' , '期末' , '期中' , '期末' , '期中' , '期末' ]])

df

上面通過在columns傳入一個二維數組來隱式創建多級索引,結果如下:

d30fdfbeb312

image.png

仔細觀察就可以發現上面的表格中包含學生(A/B/C/D)、科目(數學/語文)、考試階段(期中/期末)三個維度的信息,但是是用一張二維表格來呈現。

方法二 —— 通過pd.MultiIndex顯示創建

常用的有 from_tuples, from_arrays, from_product 三種方法,它們都是 pd.MultiIndex 對象下的函數。其中, from_product最簡單,推薦使用。下面分別舉例說明。

2.1: from_tuples指根據傳入由元組組成的列表進行構造:

my_tup = [('Python', '期中'),('Python', '期末'),('Java', '期中'),('Java', '期末')]

my_index = pd.MultiIndex.from_tuples(my_tup, names = ['Obj', 'time'])

pd.DataFrame(np.random.randint(60,100, (4,3)),

index = my_index,

columns = [*'ABC'])

d30fdfbeb312

image.png

2.2 from_arrays指根據傳入列表中,對應層的列表進行構造:

arr = [[*'ABCD'], ['a', 'b'] *2]

my_index = pd.MultiIndex.from_arrays(arr, names = ['first', 'secoond'])

col = ['China', 'US', 'UK']

val = np.random.randint(50,100, (4, 3))

df = pd.DataFrame(val, index = my_index, columns = col )

df

d30fdfbeb312

image.png

2.3 from_product指根據多個列表的笛卡爾積構造多級索引

mul_col = pd.MultiIndex.from_product([['Python', 'C++', 'Java'],['期中', '期末']])

df = DataFrame ( np . random . randint ( 0 , 100 ,( 6 , 4 )),

index = mul_col,

columns = list('ABCD'))

df

d30fdfbeb312

image.png

知識鏈接

笛卡爾積:令A和B是任意兩個集合,若序偶的第一個成員是A的元素,第二個成員是B的元素,所有這樣的序偶集合,稱為集合A和B的笛卡爾乘積或直積,記做A X B

若A={a1,a2,a3……an},B = {b1,b2,b3,……bn},

則A X B = {(a1,b1), (a1,b2),....(an,bn) }, 共有n*n個元素

且每個元素中a永遠在前面,b永遠在后面。

例如,A={a,b}, B={0,1,2},則

A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

總結一下多級索引MultiIndex和單極索引類似,只不過其索引中的一個元素是元組而不是單層索引中的標量。例如上面的例子中和單極索引一樣我們可以使用index來查看索引。另外外層連續出現相同的值時,第一次之后出現的會被隱藏顯示,使結果的可讀性增強。

df.index

>>>

MultiIndex([('Python', '期中'),

('Python', '期末'),

( 'C++', '期中'),

( 'C++', '期末'),

( 'Java', '期中'),

( 'Java', '期末')],

)

2. 多級索引的常用操作

2.1 索引層的交換和刪除

既然是多級索引,那么必然涉及到不同層之間的順序調整。在pandas中索引層的交換由swaplevel和reorder_levels完成,前者只能交換兩個層,而后者可以交換任意層,兩者都可以指定交換的是軸是哪一個,即行索引(axis = 0)或列索引(axis = 1).為了方便舉例說明,下面先創建一個多層索引的DataFrame

L1,L2,L3 = ['A','B'],['a','b'],['alpha','beta']

mul_index1 = pd.MultiIndex.from_product([L1,L2,L3], names=('Upper', 'Lower','Extra'))

L4,L5,L6 = ['C','D'],['c','d'],['cat','dog']

mul_index2 = pd.MultiIndex.from_product([L4,L5,L6], names=('Big', 'Small', 'animal'))

df_ex = pd.DataFrame(np.random.randint(-9,10,(8,8)), index=mul_index1, columns=mul_index2)

df_ex

d30fdfbeb312

image.png

swaplevel交換兩層

df_ex.swaplevel(0,2, axis = 1) # 列索引的第一層和最后一層互換

d30fdfbeb312

image.png

reorder_levels調整多層順序

df_ex.reorder_levels([2,0,1], axis = 0) # 行索引改變順序

d30fdfbeb312

image.png

若想要刪除某一層的索引,可以使用droplevel方法。同時刪除多層,可以傳入一個列表

df_ex.droplevel([0,2], axis = 0)

d30fdfbeb312

image.png

2.2 索引屬性的修改

常用的有rename_axis和rename,其中:

rename_axis:用于修改索引層的名字,即在使用pd.MultiIndex創建時傳入的names參數的值。可以傳入字典進行修改

rename: 對索引的值進行修改,如果是多級索引需要指定修改的層號level:

# 修改索引層的名字

df_ex.rename_axis(index={'Extra':'Extra_change'},

columns={'animal':'animal_change'})

d30fdfbeb312

image.png

# ranme修改索引值,index/columns均可

df_ex.rename(index = {'alpha': 'alpha_change'}, level = 2)

d30fdfbeb312

image.png

對于rename,傳入參數也可以是函數,其輸入值就是索引元素:

df_ex.rename(columns = lambda x: str.upper(x), level=2)

d30fdfbeb312

image.png

另外,在修改索引時還有一個map函數比較好用。它是定義在index之上的方法。與前面rename方法中層的函數式用法是類似的,只不過它傳入的不是層的標量值,而是直接傳入索引的元組,這樣可以對整個多級索引進行修改

例如我們將上面的索引中的小寫轉化為大寫,且在每個索引后加上 “_change':

df_temp = df_ex.copy()

new_idx = df_temp.index.map(lambda x: (x[0]+'_change',str.upper(x[1])+'_change', str.upper(x[2])+'_change'))

df_temp.index = new_idx

df_temp

d30fdfbeb312

image.png

另外,map的另外一個常用的用法是用于多層索引的壓縮,如下:

df_temp = df_ex.copy()

new_idx = df_temp.index.map(lambda x: (x[0]+'-'+x[1]+'-'+x[2]))

df_temp.index = new_idx

df_temp.head() # 將原來的三層索引壓縮為一層

d30fdfbeb312

image.png

自然的,也可以反向展開:

new_idx = df_temp.index.map(lambda x:tuple(x.split('-')))

df_temp.index = new_idx

df_temp# 三層索引

d30fdfbeb312

image.png

好了,關于多級索引就學習這么多內容!

參考:開源內容joyful-pandas, 作者: Datawhale-耿遠昊

另外,更多精彩內容也可以微信搜索,并關注公眾號:‘Python數據科學家之路“ ,期待您的到來和我交流!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529229.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

tensorflow 啟動多個session_Tensorflow源碼解析7 -- TensorFlow分布式運行時

1 概述TensorFlow架構設計精巧,在后端運行時這一層,除了提供本地運行時外,還提供了分布式運行時。通過分布式訓練,在多臺機器上并行執行,大大提高了訓練速度。前端用戶通過session.run()啟動系統執行時,tar…

shell swt 樣式_SWT之路:SWT圖像顯示

簡明現代魔法 -> Java編程語言 -> SWT之路:SWT圖像顯示SWT之路:SWT圖像顯示2009-10-03程序演示還是先用SWT Desiner創建界面程序。然后創建一個Display對象和Image對象,和一個GC對象。類org.eclipse.swt.graphics.GC是一個封裝了所有可…

swool tcp mysql_swoole/mysql(異步)

# 異步Swoole\Mysql**(要求Workerman版本>3.3.6)**## 注意:此組件由swoole底層提供,由C語言編寫,具有超高性能。## 安裝:安裝有swoole擴展即可## 示例:phprequire_once ../Autoloader.php;use Workerman\Worker;use \Swoole\My…

xamarin和mysql_Xamarin.Android 使用 SQLiteOpenHelper 進行數據庫操作

一、前言在手機中進行網絡連接不僅是耗時也是耗電的,而耗電卻是致命的。所以我們就需要數據庫幫助我們存儲離線數據,以便在用戶未使用網絡的情況下也可以能夠使用應用的部分功能,而在需要網絡連接的功能上采用提示方式,讓用戶決定…

python 絕對值誤差小于10-6_Python 被低估了的 10 個小技巧

hi,各位朋友們,小帥b回來啦,幾日不見,想我了么?今天給大家分享幾個我認為不錯的 Python 小技巧,有些可能被你低估了喲,get 起來!那么接下來就是:學習 Python 的正確姿勢俗…

java bean驗證_javaBean--登錄驗證

packagecom.JAVABean;importjava.util.HashMap;importjava.util.Map;publiccla***egister{privateStringname;privateStringage;privateStringemail;privateMaperrorsnull;//聲明一個保存全部錯誤信息的map集合publicRegister(){//在構造方法中初始化屬性this.name""…

java讀取src xml文件路徑_Java獲取路徑方法相對路徑讀取xml文件方法

(1)、request.getRealPath("/");//不推薦使用獲取工程的根路徑(2)、request.getRealPath(request.getRequestURI());//獲取jsp的路徑,這個方法比較好用,可以直接在servlet和jsp中使用(3)、request.getSession().getServletContext().getRealPa…

釋放tcp連接的命令是_最實用的6個網絡命令,網絡故障不求人

很多弱電工程師朋友在項目中經常遇到一些網絡故障,需要通過一些一些命令去檢測、定位故障點,通過使用網絡命令,故障解決的工作取得了事半功倍的效果。下面就一起溫故而知新吧!一、ping命令(因特網包探索器)…

airpods2怎么查正品 ios11系統_拼多多AirPods2開箱評測,4種辦法教你驗真假,10個AirPods技巧教你玩...

大家好,Apple今天給大家分享一下拼多多上車AirPods 2無線充電盒版的經驗,順便整理了一波AirPods使用技巧,希望你用得上。入手理由自從去年10月份入手了iPhone XR,其實就挺想入款無線耳機的,所以一直在等AirPods升級換代…

java中for break的用法_java break語句的使用方法

在switch語中,break語句用來終止switch語句的執行。使程序 switch語句后的第一個語句 開始執行。在Java中,可以為每個代碼塊加一個括號,一個代碼塊通常 用大括號{}括起來的一段 代碼。加標號的格式break語句有兩種形式:無標簽和有標簽。無標簽的break語句用來跳出單…

windows文件保護_Windows系統下媲美時間機器的系統備份工具,統統免費

Windows和macOS系統誰更美?不同的人有不同的見解。但體驗過macOS之后很多電腦玩家會感嘆,TimeMachine時間機器太好用了,Windows下有沒有同類功能呢?TimeMachine提供了全盤完整備份、增量備份、文件歷史版本等功能。它們在Windows …

JAVA結課_一點心情,寫java結課考試之前

突然發現,已經好久沒有上來寫blog了,本來還以為能夠天天寫,后來發現,確是心有余力而不足啊。學期進入中段,課業慢慢多了,各種各樣的事情也接踵而來了。本學期的java課程也已經結課了,8周32個學時…

sql怎么撤回update_騰訊SQL“現役運動員”給你的實踐小技巧

引言SQL的全稱是Structured Query Language(結構化查詢語言),是一種古老而簡潔的程序設計語言。看似平平無奇,一直被各種吐槽,但卻有著眾多語言所難得的漫長壽命,并展現出極好的拓展性,在不同時期衍生出不同的子語言。…

mysql 同一帳號多次登錄_freeradius2.1.3 防止用戶帳號重復登錄

freeradius2.1.3 防止用戶帳號重復登錄一、修改 etc/raddb/sites-enabled 目錄中的default 及inner-tunnel 這兩個文件中的# Session database, used for checking Simultaneous-Use. Either the radutmp# or rlm_sql module can handle this.# The rlm_sql module is *much…

小程序input wxss_19. 教你零基礎搭建小程序:wxss-尺寸單位

這章以后的四章都是介紹小程序樣式文件——wxss 的使用,分為以下三個部分一、尺寸方案二、樣式導入三、選擇器這章先來講wxss的尺寸單位—— rpxwxss的定義:WXSS( WeiXin Style Sheets )是?套樣式語言,用于描述 WXML 的組件樣式。與 CSS 相比…

java 最優算法_java 問題 求個最優算法

不知道是不是你要的package test;import java.util.Scanner;public class Number {/*** param args*/public static void main(String[] args) {int count 15;int val 5;Scanner input new Scanner(System.in);System.out.print("請輸入開始數:");int …

某一個接口403 其他接口可以調通_Neo的務實外設指南 篇三十六:一個就夠,65W快充+C口混插+最多6個設備 - 飛利浦65W摩天輪插座_插座...

2020-10-26 15:29:0623點贊23收藏2評論嗨,大家好!我是沈少!之前曬雷電3擴展塢的時候,已經有小伙伴注意到我用來提供PD充電的是一個很小巧的魔方插座。也有朋友私下提醒我,這類產品雖然支持PD快充協議,但一般…

linux java 獲取路徑怎么寫_linux中java獲取路徑怎么寫?

linux中java獲取路徑怎么寫?在Unix/Linux中,路徑的分隔采用正斜"/",比如"cd /home/java"。在java的代碼開發中 是代表轉義字符。相對路徑和絕對路徑. 指的是當前目錄.. 指的是當前目錄的上一級目錄./book表示當前目錄下的…

layerconfirm 自動關閉問題 沒有阻塞問題_微信新版本自動更新?趕緊關閉這個功能...

前不久安卓用戶也迎來了微信新版本的更新不少伙伴驚呼“猝不及防,一覺醒來發現微信自動更新了”一時間還沖上了話題的熱搜榜究竟是怎么肥事?小移了解到:原來是因為部分用戶設置了“微信自動更新”那么問題來了,如何關閉微信自動更…

java 動態生成getset_通過get、set方法,動態生成對象

最近在看Java的反射,把學習的東西整理一下,大家共同研究,有需要改進的地方,請大家指正。import java.beans.PropertyDescriptor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class ReflectionTest {p…