Pandas實戰(zhàn)中一些高端玩法
DataFrame數(shù)據(jù)集當(dāng)中的分層索引問題。什么是多重/分層索引
DataFrame數(shù)據(jù)集多重索引的創(chuàng)建
首先在“列”方向上創(chuàng)建多重索引,即我們在調(diào)用columns參數(shù)時傳遞兩個或者更多的數(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

index參數(shù)的時候傳遞兩個或者更多數(shù)組即可,代碼如下df?=?pd.DataFrame(np.random.randint(0,?100,?size=(4,?2)),
???????????????????index=?[['English','',?'Chinese',''],
???????????????????????????['like','dislike','like','dislike']],
???????????????????columns=['ladies',?'gentlemen'])
output

除此之外,還有其他幾種常見的方式來創(chuàng)建多重索引,分別是
pd.MultiIndex.from_arrayspd.MultiIndex.from_framepd.MultiIndex.from_tuplespd.MultiIndex.from_product
小編這里就挑其中的一種來為大家演示如何來創(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

獲取多重索引的值
接下來我們來看一下怎么獲取帶有多重索引的數(shù)據(jù)集當(dāng)中的數(shù)據(jù),使用到的數(shù)據(jù)集是英國三大主要城市倫敦、劍橋和牛津在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

df.columns.levels
output
FrozenList([['Day',?'Night'],?['Max?Temperature',?'Weather',?'Wind']])
我們想要獲取第一層級上面的索引值,代碼如下
df.columns.get_level_values(0)
output
Index(['Day',?'Day',?'Day',?'Night',?'Night',?'Night'],?dtype='object')
那么同理,第二層級的索引值,只是把當(dāng)中的0替換成1即可,代碼如下
df.columns.get_level_values(1)
output
Index(['Weather',?'Wind',?'Max?Temperature',?'Weather',?'Wind',
???????'Max?Temperature'],
??????dtype='object')
那么在“行”方向上多重索引值的獲取也是一樣的道理,這里就不多加以贅述了
數(shù)據(jù)的獲取
loc()方法以及iloc()方法了,例如df.loc['London'?,?'Day']
##?或者是
df.loc[('London',?)?,?('Day',?)]
output

loc()方法來獲取第一層級上的數(shù)據(jù),要是我們想要獲取所有“行”的數(shù)據(jù),代碼如下df.loc[:,?'Day']
##?或者是
df.loc[:,?('Day',)]
output

或者是所有“列”的數(shù)據(jù),代碼如下
df.loc['London'?,?:]
##?或者是
df.loc[('London',?)?,?:]
output

當(dāng)然我們也可以這么來做,在行方向上指定第二層級上的索引,代碼如下
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

loc['Cambridge', 'Day']的時候返回的是DataFrame數(shù)據(jù)集,然后再通過調(diào)用loc()方法來提取數(shù)據(jù),當(dāng)然這里還有更加快捷的方法,代碼如下df.loc[('Cambridge',?'2019-07-01'),?'Day']
df.loc[?
????('Cambridge'?,?['2019-07-01','2019-07-02']?)?,
????'Day'
]
output

或者是獲取多列的數(shù)據(jù),代碼如下
df.loc[?
????'Cambridge'?,
????('Day',?['Weather',?'Wind'])
]
output

df.loc[
????('Cambridge',?'2019-07-01':?'2019-07-03'),
????'Day'
]
output

這么來寫是會報語法錯誤的,正確的方法應(yīng)該是這么來做,
df.loc[
????('Cambridge','2019-07-01'):('London','2019-07-03'),
????'Day'
]
xs()方法的調(diào)用
xs()方法來指定多重索引中的層級,例如我們只想要2019年7月1日各大城市的數(shù)據(jù),代碼如下df.xs('2019-07-01',?level='Date')
output

df.xs(('London',?'2019-07-04'),?level=['City','Date'])
output

axis參數(shù)來指定是獲取“列”方向還是“行”方向上的數(shù)據(jù),例如我們想要獲取“Weather”這一列的數(shù)據(jù),代碼如下df.xs('Weather',?level=1,?axis=1)
output

當(dāng)中的level參數(shù)代表的是層級,我們將其替換成0,看一下出來的結(jié)果
df.xs('Day',?level=0,?axis=1)
output

篩選出來的是三個主要城市2019年白天的氣候數(shù)據(jù)
IndexSlice()方法的調(diào)用
Pandas內(nèi)部也提供了IndexSlice()方法來方便我們更加快捷地提取出多重索引數(shù)據(jù)集中的數(shù)據(jù),代碼如下from?pandas?import?IndexSlice?as?idx
df.loc[?
????idx[:?,?'2019-07-04'],?
????'Day'
]
output

我們同時可以指定行以及列方向上的索引來進行數(shù)據(jù)的提取,代碼如下
rows?=?idx[:?,?'2019-07-02']
cols?=?idx['Day'?,?['Max?Temperature','Weather']]
df.loc[rows,?cols]
output

對比Excel系列圖書累積銷量達15w冊,讓你輕松掌握數(shù)據(jù)分析技能,可以在全網(wǎng)搜索書名進行了解選購:

