<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
pandas資料框針對高維資料,也有多層索引的辦法去應對。多層資料一般長這個樣子
可以看到AB兩大列,下面又有xy兩小列。 行有abc三行,又分為onetwo兩小行。
在分組聚合的時候也會產生多層索引,下面演示一下。
匯入包和資料:
import numpy as np import pandas as pd df=pd.read_excel('team.xlsx')
分組聚合:
df.groupby(['team',df.mean(1)>60]).count() #每組平均分大於60的人的個數
可以看到分為abcde五組,平均分大於60 的組員兩小行。
#序列中建立 arrays = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']] index=pd.MultiIndex.from_arrays(arrays, names=('number', 'color')) index
pd.DataFrame([{'a':1, 'b':2}], index=index)
#來自元組建立 arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] tuples = list(zip(*arrays)) index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) pd.Series(np.random.randn(8), index=index)
#可迭代物件的笛卡爾積,排列組合各種情況 numbers = [0, 1, 2] colors = ['green', 'purple'] index = pd.MultiIndex.from_product([numbers, colors],names=['number', 'color']) pd.Series(np.random.randn(6), index=index)
#來自 DataFrame df = pd.DataFrame([['bar', 'one'], ['bar', 'two'], ['foo', 'one'], ['foo', 'two']], columns=['first', 'second']) ''' first second 0 bar one 1 bar two 2 foo one 3 foo two ''' index = pd.MultiIndex.from_frame(df) pd.Series(np.random.randn(4), index=index)
index_arrays = [[1, 1, 2, 2], ['男', '女', '男', '女']] columns_arrays = [['2020', '2020', '2021', '2021'], ['上半年', '下半年', '上半年', '下半年',]] index = pd.MultiIndex.from_arrays(index_arrays,names=('班級', '性別')) columns = pd.MultiIndex.from_arrays(columns_arrays,names=('年份', '學期')) df = pd.DataFrame([(88,99,88,99),(77,88,97,98), (67,89,54,78),(34,67,89,54)],columns=columns, index=index) df
#索引名稱的檢視: df.index # 索引, 是一個 MultiIndex df.columns # 引索引,也是一個 MultiIndex # 檢視行索引的名稱 df.index.names # FrozenList(['班級', '性別']) # 檢視列索引的名稱 df.columns.names # FrozenList(['年份', '學期'])
#索引的層級: df.index.nlevels # 層級數 2 df.index.levels # 行的層級 # FrozenList([[1, 2], ['女', '男']]) df.columns.levels # 列的層級 # FrozenList([['2020', '2021'], ['上半年', '下半年']]) df[['2020','2021']].index.levels # 篩選後的層級 # FrozenList([[1, 2], ['女', '男']])
#索引內容的檢視: # 獲取索引第2層內容 df.index.get_level_values(1) # Index(['男', '女', '男', '女'], dtype='object', name='性別') # 獲取列索引第1層內容 df.columns.get_level_values(0) # Index(['2020', '2020', '2021', '2021'], dtype='object', name='年份') # 按索引名稱取索引內容 df.index.get_level_values('班級') # Int64Index([1, 1, 2, 2], dtype='int64', name='班級') df.columns.get_level_values('年份') # Index(['2020', '2020', '2021', '2021'], dtype='object', name='年份') # 多層索引的資料型別,1.3.0+ df.index.dtypes
#排序
# 使用索引名可進行排序,可以指定具體的列 df.sort_values(by=['性別', ('2020','下半年')]) df.index.reorder_levels([1,0]) # 等級順序,互換 df.index.set_codes([1, 1, 0, 0], level='班級') # 設定順序 df.index.sortlevel(level=0, ascending=True) # 按指定級別排序 df.index.reindex(df.index[::-1]) # 更換順序,或者指定一個順序
相關操作轉換:
df.index.to_numpy() # 生成一個笛卡爾積的元組對列表 # array([(1, '男'), (1, '女'), (2, '男'), (2, '女')], dtype=object) df.index.remove_unused_levels() # 返回沒有使用的層級 df.swaplevel(0, 2) # 交換索引 df.to_frame() # 轉為 DataFrame idx.set_levels(['a', 'b'], level='bar') # 設定新的索引內容 idx.set_levels([['a', 'b', 'c'], [1, 2, 3, 4]], level=[0, 1]) idx.to_flat_index() # 轉為元組對列表 df.index.droplevel(0) # 刪除指定等級 df.index.get_locs((2, '女')) # 返回索引的位置
#查詢指定行 df.loc[1] #一班的 df.loc[(1, '男')] # 一年級男 df.loc[1:2] # 一二兩年級資料
#查詢指定列 df['2020'] # 整個一級索引下 df[('2020','上半年')] # 指定二級索引 df['2020']['上半年'] # 同上
#行列綜合 slice(None)表示本層所有內容 df.loc[(1, '男'), '2020'] # 只顯示2020年一年級男 df.loc[:, (slice(None), '下半年')] # 只看下半年的 df.loc[(slice(None), '女'),:] # 只看女生 df.loc[1, (slice(None)),:] # 只看1班 df.loc[:, ('2020', slice(None))] # 只看 2020 年的
#查詢指定條件
#和單層索引的資料查詢一樣,不過在選擇列上要按多層的規則。 df[df[('2020','上半年')] > 80]
#pd.IndexSlice切片使用: idx = pd.IndexSlice idx[0] # 0 idx[:] # slice(None, None, None) idx[0,'x'] # (0, 'x') idx[0:3] # slice(0, 3, None) idx[0.1:1.5] # slice(0.1, 1.5, None) idx[0:5,'x':'y'] # (slice(0, 5, None), slice('x', 'y', None))
#查詢應用: idx = pd.IndexSlice df.loc[idx[:,['男']],:] # 只顯示男 df.loc[:,idx[:,['上半年']]] # 只顯示上半年 #df.xs() df.xs((1, '男')) # 一年級男生 df.xs('2020', axis=1) # 2020 年 df.xs('男', level=1) # 所有男生
df.groupby(level=0).sum() df.groupby(level='性別').sum() df.sum(level='班級') # 也可以直接統計
df.groupby(level=['性別', '班級']).sum()
到此這篇關於Pandas資料分析-andas資料框的多層索引的文章就介紹到這了,更多相關pandas多層索引內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45