介紹 Pandas 實(shí)戰(zhàn)中一些高端玩法
什么是多重/分層索引
多重/分層索引(MultiIndex)可以理解為堆疊的一種索引結(jié)構(gòu),它的存在為一些相當(dāng)復(fù)雜的數(shù)據(jù)分析和操作打開了大門,尤其是在處理高緯度數(shù)據(jù)的時(shí)候就顯得十分地便利,我們首先來(lái)創(chuàng)建帶有多重索引的DataFrame數(shù)據(jù)集。
多重索引的創(chuàng)建
首先在“列”方向上創(chuàng)建多重索引,即我們?cè)谡{(diào)用columns參數(shù)時(shí)傳遞兩個(gè)或者更多的數(shù)組,代碼如下:
df1 = pd.DataFrame(np.random.randint(0, 100, size=(2, 4)),
index= ['ladies', 'gentlemen'],
columns=[['English', 'English', 'French', 'French'],
['like', 'dislike', 'like', 'dislike']])
output
那么同理我們想要在“行”方向上存在多重索引,則是在調(diào)用index參數(shù)的時(shí)候傳遞兩個(gè)或者更多數(shù)組即可,代碼如下:
df = pd.DataFrame(np.random.randint(0, 100, size=(4, 2)),
index= [['English','', 'Chinese',''],
['like','dislike','like','dislike']],
columns=['ladies', 'gentlemen'])
output
除此之外,還有其他幾種常見的方式來(lái)創(chuàng)建多重索引,分別是:
- pd.MultiIndex.from_arrays
- pd.MultiIndex.from_frame
- pd.MultiIndex.from_tuples
- pd.MultiIndex.from_product
小編這里就挑其中的一種來(lái)為大家演示如何來(lái)創(chuàng)建多重索引,代碼如下:
df2 = pd.DataFrame(np.random.randint(0, 100, size=(4, 2)),
columns= ['ladies', 'gentlemen'],
index=pd.MultiIndex.from_product([['English','French'],
['like','dislike']]))
output
獲取多重索引的值
接下來(lái)我們來(lái)看一下怎么獲取帶有多重索引的數(shù)據(jù)集當(dāng)中的數(shù)據(jù),使用到的數(shù)據(jù)集是英國(guó)三大主要城市倫敦、劍橋和牛津在2019年全天的氣候數(shù)據(jù),如下所示:
import pandas as pd
from pandas import IndexSlice as idx
df = pd.read_csv('dataset.csv',
index_col=[0,1],
header=[0,1]
)
df = df.sort_index()
df
output
在“行”索引上,我們可以看到是“城市”以及“日期”這兩個(gè)維度,而在“列”索引上,我們看到的是則是“不同時(shí)間段”以及一些“氣溫”等指標(biāo),首先來(lái)看一下“列”方向多重索引的層級(jí),代碼如下:
df.columns.levels
output
FrozenList([['Day', 'Night'], ['Max Temperature', 'Weather', 'Wind']])
我們想要獲取第一層級(jí)上面的索引值,代碼如下:
df.columns.get_level_values(0)
output
Index(['Day', 'Day', 'Day', 'Night', 'Night', 'Night'], dtype='object')
那么同理,第二層級(jí)的索引值,只是把當(dāng)中的0替換成1即可,代碼如下:
df.columns.get_level_values(1)
output
Index(['Weather', 'Wind', 'Max Temperature', 'Weather', 'Wind',
'Max Temperature'],
dtype='object')
那么在“行”方向上多重索引值的獲取也是一樣的道理,這里就不多加以贅述了。
數(shù)據(jù)的獲取
那么涉及到數(shù)據(jù)的獲取,方式也有很多種,最常用的就是loc()方法以及iloc()方法了,例如:
df.loc['London' , 'Day']
## 或者是
df.loc[('London', ) , ('Day', )]
output
通過(guò)調(diào)用loc()方法來(lái)獲取第一層級(jí)上的數(shù)據(jù),要是我們想要獲取所有“行”的數(shù)據(jù),代碼如下:
df.loc[:, 'Day']
## 或者是
df.loc[:, ('Day',)]
output
或者是所有“列”的數(shù)據(jù),代碼如下:
df.loc['London' , :]
## 或者是
df.loc[('London', ) , :]
output
當(dāng)然我們也可以這么來(lái)做,在行方向上指定第二層級(jí)上的索引,代碼如下:
df.loc['London' , '2019-07-02']
## 或者是
df.loc[('London' , '2019-07-02')]
output
多重索引的數(shù)據(jù)獲取
假設(shè)我們想要獲取劍橋在2019年7月3日白天的數(shù)據(jù),代碼如下:
df.loc['Cambridge', 'Day'].loc['2019-07-03']
output
在第一次調(diào)用loc['Cambridge', 'Day']的時(shí)候返回的是DataFrame數(shù)據(jù)集,然后再通過(guò)調(diào)用loc()方法來(lái)提取數(shù)據(jù),當(dāng)然這里還有更加快捷的方法,代碼如下:
df.loc[('Cambridge', '2019-07-01'), 'Day']
我們需要傳入元祖的形式的索引值來(lái)進(jìn)行數(shù)據(jù)的提取。要是我們不只是想要獲取單行或者是單列的數(shù)據(jù),可以這么來(lái)操作:
df.loc[
('Cambridge' , ['2019-07-01','2019-07-02'] ) ,
'Day'
]
output
或者是獲取多列的數(shù)據(jù),代碼如下:
df.loc[
'Cambridge' ,
('Day', ['Weather', 'Wind'])
]
output
我們要是想要獲取劍橋在2019年7月1日到3日,連續(xù)3天的白天氣候數(shù)據(jù),代碼如下:
df.loc[
('Cambridge', '2019-07-01': '2019-07-03'),
'Day'
]
output
這么來(lái)寫是會(huì)報(bào)語(yǔ)法錯(cuò)誤的,正確的方法應(yīng)該是這么來(lái)做:
df.loc[
('Cambridge','2019-07-01'):('London','2019-07-03'),
'Day'
]
xs()方法的調(diào)用
小編另外推薦xs()方法來(lái)指定多重索引中的層級(jí),例如我們只想要2019年7月1日各大城市的數(shù)據(jù),代碼如下:
df.xs('2019-07-01', level='Date')
output
還能夠接受多個(gè)維度的索引,例如想要獲取倫敦在2019年7月4日的全天數(shù)據(jù),代碼如下:
df.xs(('London', '2019-07-04'), level=['City','Date'])
output
另外還有axis參數(shù)來(lái)指定是獲取“列”方向還是“行”方向上的數(shù)據(jù),例如我們想要獲取“Weather”這一列的數(shù)據(jù),代碼如下:
df.xs('Weather', level=1, axis=1)
output
當(dāng)中的level參數(shù)代表的是層級(jí),我們將其替換成0,看一下出來(lái)的結(jié)果。
df.xs('Day', level=0, axis=1)
output
篩選出來(lái)的是三個(gè)主要城市2019年白天的氣候數(shù)據(jù)。
IndexSlice()方法的調(diào)用
同時(shí)Pandas內(nèi)部也提供了IndexSlice()方法來(lái)方便我們更加快捷地提取出多重索引數(shù)據(jù)集中的數(shù)據(jù),代碼如下:
from pandas import IndexSlice as idx
df.loc[
idx[: , '2019-07-04'],
'Day'
]
output
我們同時(shí)可以指定行以及列方向上的索引來(lái)進(jìn)行數(shù)據(jù)的提取,代碼如下:
rows = idx[: , '2019-07-02']
cols = idx['Day' , ['Max Temperature','Weather']]
df.loc[rows, cols]
output