1. 程式人生 > >pandas學習筆記之Dataframe索引

pandas學習筆記之Dataframe索引

  #  DataFra是一個表格,  有行索引和列索引,可以被看做由Series組成的字典(共用一個索引)
    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame(np.random.rand(12).reshape(3,4) * 100, index = ["one","two","three"], columns = list("abcd"))
    print(df)
    print("-----------------")
    
    # 選擇列
    data1 = df["a"]  # 預設選擇行
    print(data1)
    print()
    data2 = df[["a", "d"]]
    print(data2)
    print()
    # []中寫列名,所以一般資料columns都會單獨制定,不會用預設數字列名,以免和index衝突
    data3 = df.loc["one"]
    print(data3)
    print(type(data3))  # 單選為Series
    print()
    
    data4 = df.loc[["one","three"]]
    print(data4)
    print(type(data4))  # 多選為Dataframe
    
    data5 = df[:1]
    print(data5)
    print(type(data5))
    print()
    # print(df[0]) # KeyError: 0

# 總結:df[]中為數字的時候,預設選擇行,並且只能進行切片,不能單獨選擇(df[0]會報錯),
#      另外的,即使只選擇一行,其結果格式仍然為Dataframe格式,這裡需要注意一下,使用loc[index]取一行為Series格式
    
# 核心筆記:df[col]一般用於選擇列,[]中寫列名

df.loc[] 按index選擇行(列索引)

df = pd.DataFrame(np.random.rand(16).reshape(4,4) * 100, index = ["one","two","three", "four"], columns = list("abcd"))
print(df)
print()
print(df["a"])
print(df["a"]["one"])
print(df["a"][0])
# print(df.loc[0])  # 報錯

print()
# 
print(df.loc["one"])
print(df.loc[["one","three"]])

print()
print(df.loc["one":"three"])  # 針對index做切片索引,這裡是末端包含的

df.iloc[] - 按照整數位置(從軸的0到length-1)選擇行(行索引)

類似list的索引,其順序就是dataframe的整數位置,從0開始計

df = pd.DataFrame(np.random.rand(16).reshape(4,4) * 100, index = ["one","two","three", "four"], columns = list("abcd"))
print(df)

print(df.iloc[0])
print(df.iloc[[0,1,2]])  # 多行索引,位置可以變
print(df.iloc[[2,0,1]])
# print(df.iloc[4])  # 這裡報錯
# 和loc索引不同,不能索引超出資料行數的整數位置

print()

print(df.iloc[1:3])
# 切片索引,末端不包含(針對整數位置索引)

Dataframe 的 布林索引

df = pd.DataFrame(np.random.rand(16).reshape(4,4) * 100, index = ["one","two","three", "four"], columns = list("abcd"))
print(df)
print("----------------------")

b1 = df < 20
print(b1, type(b1))
print(df[b1])
print()
#  不做索引則會對資料每個值進行判斷
#  索引結果保留 所有資料:True返回原資料, False返回值為NaN

print(df[df[["a"]]>50])
# 單列做判斷
# 索引結果保留所有資料,True返回元資料,False返回值為NaN

print()
print(df[df[["a","b"]]>50])


print()
print(df[df.loc[["one","three"]]>50])
# 多行做判斷(根據index)
# 索引結果保留所有資料,True返回元資料,False返回值為NaN

print()
print(df[df.iloc[[1,3]]>50])

多重索引:比如同時索引 行和列

先選擇列,再選擇行----相當於對於一個數據,先篩選欄位,再選擇資料

df = pd.DataFrame(np.random.rand(16).reshape(4,4) * 100, index = ["one","two","three", "four"], columns = list("abcd"))
print(df)
print("----------------------")
print(df["a"].loc[["one","four"]])   # Series格式
print()
print(df[["a","d"]].loc[["one","four"]])  # dataframe格式
print()
print(df[df>50].iloc[::2])

print()
# print(df[["a","b","y"]]) # KeyError: "['y'] not in index"
# print(df.loc[["p"]])   這裡都會報錯,因為此時陣列已經建立完成

對於多重索引,讀者可以嘗試更多的索引方式,這裡不再贅述