Python--Pandas.2(DataFrame的概念和創建,索引,基本操作)


DataFrame

DataFrame 概念和創建 :

先來看一個例子 :
這是一個由列表組成的字典

 

import numpy as np
import pandas as pd
  
data = {'name':['Jack','Tom','Mary'],'age':[18,19,21],'gender':['m','m','w']}
frame = pd.DataFrame(data)
print(frame)

 

 

 可以看到 DataFrame 可以理解是一個二維數組,是一個表格型的數據結構,它包含了有序的列.

其列的值 ,它可以是 字符串 數值 或者是 布爾值等. 從行和列看,DataFrame是一個帶有標簽的二維數組
 
如何取行和列呢?    是用index 和 columns屬性可以拿到,如下 :
print(frame.index)  # 取列,標簽,索引
print(frame.columns)  # 取行

 

 

 也可以使用Values 取得該DataFrame的值 :

print(frame.values , type(frame.values))

 

 查看該frame的屬性,可以看到該frame還是一個數組,接下來看看DataFrame的創建方式

 


方法一 : 是由 數組或者list組成的字典. 每一個鍵值對,就是一列,且長度需要一致.如圖

 

 

 

 還可以指定DataFrame的,使用cloumns屬性和 index 屬性  list類型參數,(如果設置的該列不存在,就用NaN填充) :

frame = pd.DataFrame(data,index=['Jack','Tom','Mary'],columns=['age','name','gender','height'])

 

 

 需要注意的是 指定index 重新定義索引,格式是list ,長度需要一致.否則報錯!

 

方法二 : 由 Series組成的字典 :

data1 = {'one':pd.Series(np.random.rand(2)),'two':pd.Series(np.random.rand(3))}  #沒有設置index的Series
data2 = {'one':pd.Series(np.random.rand(2),index=['a','b']),'two':pd.Series(np.random.rand(3),index=['a','b','c'])}  #設置了indes9Series
print (data2)
df1 = pd.DataFrame (data1)
df2 = pd.DataFrame (data2)

 

 

 與上面的方法一相比,Series 可以長度不一樣,對於沒有的值,DataFrame會用NaN填充.

由Series 組成的字典, 創建DataFrame時, columns為字典的key,index為Series 的標簽,就是索引.如果Series沒有指定標簽,那就默認用數字標簽.

 

方法三  : 通過 二維數組 直接創建

arr = pd.DataFrame(np.random.rand(9).reshape(3,3))

 

 

 可以看到,由於沒設置 行和列 , 所以默認用數字標簽. 這樣不美觀,不便於編碼,所以我們可以手動添加columns和index 

arr1 = pd.DataFrame(np.random.rand(9).reshape(3,3),index=['a','b','c'],columns=['one','two','three'])

 

 

 通過 二維數組 直接創建DataFrame,得到一個形狀的結果數據.如果不指定index 和 columns,兩者均返回默認的數字格式.

 ?? 嘗試一下index 或columns 長度不等於已有數據的情況 ??

arr1 = pd.DataFrame(np.random.rand(9).reshape(3,3),index=['a','b','c','d'],columns=['one','two','three'])  #index中的d

 

 

 報錯了, 所以index 和columns的長度必須與原數據保持一致!

 

 方法四 : 由 字典組成的列表

data = [{'one':1,'two':2},{'one':5,'two':10,'three':20}]
arr= pd.DataFrame(data)

 

 

 由 字典組成的列表創建DataFrame, columns為字典的key ,index 不做指定則默認為數據標簽.

如果設置index 那么標簽/索引就是 指定的 : 

arr= pd.DataFrame(data,index=['a','b'])

 

 

 如果只設置了行 那么 就只創建指定的行

arr= pd.DataFrame(data,columns=['one','two'])

 

 

# columns 和 index 參數分別重新指定相應列 及行 標簽  以上#

 

方法五 : 由 字典組成的字典 

data = {
    'Jack':{
        'math':90,'english':89,'art':78
    },
    'Marry':{
        'math':82,'english':95,'art':92
    },
    'Tom':{
        'math':78,'english':67
    }
}
df = pd.DataFrame(data)

 

 

 # 可以看到 由字典組成的字典創建DataFrame ,columns為字典的key , index 就是字典的key.

另外 : columns參數可以增加和減少現有的列 ,如果出現新的列,會用NaN值進行填充 ,如下 : 

df = pd.DataFrame(data , columns=['Jack','Marry','Tom'])

 

 

另外 Index正在這里可之前不同, 不能改變原有的 index ,如果指定為新的標簽 ,值就會變成NaN ,因為它匹配不到指定的標簽(非常重要) ,如圖 : 

df = pd.DataFrame(data , index=['a','b','c'])

 

 

 ### 以上就是DataFrame的幾種創建方法 . . . . . .

 

 


DataFrame 索引 :

1. 如何選擇 行 和 列  : 

df = pd.DataFrame(np.random.rand(12).reshape(3,4),index=['one','two','three'],columns=list('abcd'))

 

 

 選擇一列 或者 多列 :

df['a']  #單列 
df[['a','c']] #多列

DataFrame是一個包含多個Series的數組, 所以 返回的單列 是一個 Series . 返回多列 則是一個DataFrame.

 

 

單獨選列 整數參數可以選擇行,但是不能單獨選 必須以冒號來選 ,利用切片的方式 !

行 - loc : 按index 選擇行

df.loc['two']

 

 

 當我們指定index 只能使用索引標簽, 未指定index 才能使用數字索引 .  返回的單行  和 多行,同上,Series 和DataFrame類型

 如果選擇 不存在 的行 ,Pycharm 會報錯 , 而Jupyter 則會用NaN填充!

標簽不同 切片方式也不相同 :

df = pd.DataFrame(np.random.rand(12).reshape(3,4),index=['one','two','three'],columns=list('abcd'))
df1 = pd.DataFrame(np.random.rand(12).reshape(3,4),columns=list('abcd'))
print(df.loc['two':'three'])
print(df1.loc[1:2])

 

 

 DataFrame 使用整數做索引,index是可變的,所以整數成了標簽,string 而不是數字. 標簽切片 ,閉區間

 DataFrame.loc[ label ] 主要是針對 行 索引 ,同時指出指定index 以及默認index 

 

DataFrame .iloc[ ]   按照參數位置(從0到length-1) 選擇行,類似於 list 的索引,順序是DataFrame的整數位置,從0開始

df.iloc[0]  #取一行
df.iloc[[0,1]] #選擇多行
df.iloc[[1,0]] #位置變換去行

 

 

 運行之后,從結果可以看出,正常索引沒有問題,選擇多行, 索引順序可變,python會自動去配對相應的行索引. 同時索引時,不能超出索引的范圍

如果忘了 函數的使用 可以用全局函數 help(參)  接口來查看相應的使用方式及詳細說明

 

布爾型索引 -- 原理上 和Series 原理相同,看代碼 : 

df = pd.DataFrame(np.random.rand(12).reshape(3,4),index=list('one','two','three'),columns=list('a','b','c','d')) * 100

 

 

b1 = df <50 # 返回一個和df形狀相同的布爾型的dataframe
df[b1]  #返回一個dataframe,所有數據,True返回原數據,False 返回NaN

 

 還可以對單列進行判斷 : 

b2 = df['a']>30
print(df['a'][b2])

 

 # 單列就是一個Series ,索引時,保留判斷為True的列數據和行. 范湖的是一個Series .

還可以多行,多列判斷 :

b3 = df[['a','b']]>30
print(df[b3])

 

 多行多列 返回形狀相同的dataframe ,為True的返回原數據,False返回NaN 值.

 

多重索引  同時索引行和列

#多重索引的幾種方式
df['a'].loc[['one','three']]  #從A列索引one ,three 兩行數據
df[['b','c','d']].iloc[::2]  # 從b,c,d3列索引,每隔2個索引一條
df[df['a']<50].iloc[0]  #索引A列小於50的第一個值

 

 索引的方式多種多樣 , 多嘗試多探索. 索引的基本方式就是這樣了


DataFrame 基本操作 :

 

df = DataFrame(np.random.rand(10000).reshape(100,100))

 前 head()  尾 tail() :

df.head(2)   # 查看前 2行

df.tail(3)   #查看尾 3行  默認查看5行

 

 

 數據轉置

dfs = DataFrame(np.random.rand(4).reshape(2,2))
dfs dfs.T

 

 

 添加和修改

添加 index 和 添加columns :

dfs.index =['one','two']
dfs.columns=list('ab')

 

 

 添加 指定 值 :

dfs['c'] =88

 

 

 修改 列多列 :

dfs['c'] =20
dfs[['a','b']] = 33

 

 

 添加 行  :

dfs.loc['c'] =6  #添加行 c 並指定值為6

 

 

 ① 刪除 :

del dfs['a']

 

 

 

  列刪除方法  drop  :

dfs.drop('one')  # 按索引刪除  數字,字符串 類型  默認返回刪除后的DataFrame  不修改原數據

 

 

 drop 有個默認參數 'axis' , 默認為0, 刪除行. 設置為1 刪除列

dfs.drop('b',axis=1)

 

 

 # drop 默認返回一個數據類型, 設置inplace為True時,不返回值,會修改原數據 

dfs.drop('b',axis=1,inplace=True)
print(dfs)

 

 

 

對齊 將兩個DataFrame相加時

df1 = DataFrame(np.arange(9).reshape(3,3),columns=list('abc'))
df2 = DataFrame(np.arange(4).reshape(2,2),columns=list('ab'))

print(df1+df2)

 

 

 DataFrame相加時  按照行和列 對齊相加,如果不存在的行和列 則和NaN相加 ,NaN和任何值相加都為NaN

 

排序功能

對行 或者 列 進行排序 :

df = DataFrame(np.random.randint(16,size=[4,4]),columns=list('abcd'))
print(df)  #原數據

 

 

 按值 排序 :

df.sort_values('d') 

 

 

 

  👆 : 按照列標簽等於指定 列 的值進行排序 , 默認從小到大, 參數 ascending 默認為True 升序,False就降序

  👆 :默認 axis=0 用列的值對行進行排序,設置 1 則對行的值對列進行排序。所以第一個參數需要傳入列索引

 

df.sort_values(2,axis=1)

 

 

 

索引排序 

df.index= [5,3,1,2]
df.sort_index() 

 

 

 👆 :默認按索引進行升序,ascending=False 降序 ,如果要對列排序 將axis參數設置為 1 即可。(行首和列首只有一行,所以不需要填索引)

 👆 :sort_values , sort_index   都有一個 inplace  的參數,作用與上面的API一致(設置為True 時,修改原數據不返回對象,否則返回新的對象.)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM