Pandas的多層索引

import numpy as np
from pandas import DataFrame, Series
import matplotlib.pyplot as plt
import pandas as pd


'''1.創建多層索引
1)隱式構造:最常見的方法是給DataFrame構造函數的index參數傳遞兩個或更多的數組
'''
# Series也可以創建多層索引
s = Series([1, 2, 3, 4], index=[["a", "a", "b", "b"], ["期中", "期末", "期中", "期末"]])
print(s)

# DataFrame創建多層索引
df = DataFrame(np.random.randint(60, 150, size=(6, 3)), columns=["語文", "數學", "英語"],
               index=[["張三", "張三", "李四", "李四", "王五", "王五"],
                      ["Mid", "End", "Mid", "End", "Mid", "End"]])
print(df)


'''
2)顯示構造pd.MultiIndex
'''
# 使用數組
df1 = DataFrame(np.random.randint(60, 150, size=(6, 3)), columns=["Java", "C++", "PHP"],
                index=pd.MultiIndex.from_arrays([["張三", "張三", "李四", "李四", "王五", "王五"],
                          ["期中", "期末", "期中", "期末", "期中", "期末"]]))
print(df1)


# 使用tuple
df2 = DataFrame(np.random.randint(60, 150, size=(6, 3)), columns=["Java", "C++", "PHP"],
                index=pd.MultiIndex.from_tuples([("張三", "期中"), ("張三", "期末"), ("李四", "期中"),
                                                ("李四", "期末"), ("王五", "期中"), ("王五","期末")]))
print(df2)


# 使用product 最簡單,推薦使用
df3 = DataFrame(np.random.randint(60, 150, size=(6, 3)), columns=["Java", "C++", "PHP"],
                index=pd.MultiIndex.from_product([["張三", "李四", "王五"],
                                                  ["期中", "期末"]]))
print(df3)


# 對DataFrame列同樣可以設置多層索引
df4 = DataFrame(np.random.randint(60, 150, size=(3, 6)),
                columns=pd.MultiIndex.from_product([["Java", "C++", "PHP"], ["期中", "期末"]]),
                index=["張三", "李四", "王五"])
print(df4)


'''練習:創建一個DataFrame,表示出張三李四期中期末各科成績'''


'''3.多層索引對象的索引與切片操作
1)Series的操作【重要】
對於Series來說,直接中括號[]與使用.loc()完全一樣。因此,推薦使用中括號索引和切片。'''
# (1)索引
# 第一個參數:多層索引的第一維,第二個參數:第二維
print(s["a", "期末"])
# ["a", "期末"]作爲一個參數
print(s[["a", "期末"]])
print(s[["a", "b", "c"]])


# 切片
print(s["a": "b"])
# 將a的期中期末和b的期中進行顯示
print(s.iloc[0:3])


'''
2)DataFrame的操作
'''
# (1)可以直接使用列名稱來進行索引
df5 = DataFrame(np.random.randint(0, 150, size=(3, 3)),index=["張三", "李四", "王五"],
                columns=["Java", "PHP", "Python"])
print(df5)
# 對於二維的索引,如果包含中文,進行切片時可能會出現bug
print(df5["張三":"李四"])


# (2)使用行索引需要.ix(),loc()函數【極其重要】推薦使用loc()函數
# 注意:在對行進行索引的時候,若第一級索引還有多個,對二級行索引會遇到問題,也就是說,無法直接進行
# 對二級索引進行行索引,必須讓二級索引變成一級索引後才能對其進行索引!
print(df3.loc["張三"].loc["期中"])
print(df3.loc["張三", "期中"])
print(df5.loc["張三"])


'''
4.索引的堆(stack)   (1) stack()     (2) unstack()
【小技巧】使用stack()的時候,level等於哪一個,哪一個就消失,出現在行裏。
【小技巧】使用unstack()的時候,level等於哪一個,哪一個就消失,出現在列裏。
'''
print("\033[31;1m***************索引的堆*****************\033[0m")
print(df4)
# stack = 堆---->行
# 對於多次索引的列而言,0,1,2:從上往下計數
print(df4.stack(level=0))
print(df4.unstack())


'''
5.聚合操作【注意】需要指定axis
【小技巧】和unstack()相反,聚合的時候,axis等於哪一個,哪一個就保留
'''
# 所謂的聚合操作:平均數、方差、最大值、最小值......
print("\033[34;1m***************聚合操作*****************\033[0m")
print(df3)

# axis=0 行,對行進行求和操作,行的數據就被加和到一起,列就顯示了
print(df3.sum(axis=0))

# 計算方差
print(df3.std(axis=0))

# 計算最大值
print(df3.max())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章