Python数据分析pandas之dataframe初识
生活随笔
收集整理的這篇文章主要介紹了
Python数据分析pandas之dataframe初识
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Python數據分析pandas之dataframe初識
聲明與簡介
pandas是一個基于python的、快速的、高效、靈活、易用的開源的數據處理、分析包(工具)。。pandas構建在numpy之上,它通過DataFrame(數據框)來操作數據。數據框是一個高效的可以指定行和列標簽的多維數組,通過這種數據類型可以更方便的操作、分析數據。本文主要介紹DataFrame的初始化和訪問、缺失值處理的常見方法。
創建DataFrame
DataFrame可以看作是二維數組的模擬,可以通過行索引和列名對數組進行檢索。數據框是二維的,由行和列組成,類似數據庫里的二維表的概念(眾多行和列組成)。
我們也可以把DataFrame看作是特殊的Numpy數組或者Python字典對象。
DataFrame(二維數組)是有一對排序有序的Series(一維數組)組成的,這里的有序指的是他們有相同的索引。
拼接字典方式的Series
#以學生學號、姓名、年齡的學生信息的DataFrame為例,演示DataFrame與Series的關系。 import pandas as pd age={"no_001":28,"no_002": 32,"no_003": 19}name={"no_001":"張三","no_002": "李四","no_003":"王二"}df= pd.DataFrame({"name":name,"age":age})print(df)#結果name age no_001 張三 28 no_002 李四 32 no_003 王二 19#這里不難發現,Series name和Series age有相同的序列,即索引系統。這里可以理解為記錄序號或者學號。二維Numpy數組
#通過Numpy數組的方式創建以學號為索引,含姓名和年齡的學生信息的數據框 import pandas as pd df=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003']) print(df)#結果name age no_001 張三 28 no_002 李四 32 no_003 王二 19由結構化(體)數組創建
#通過一個結構體將分開的數組串成一個整體。這里的結構體類似于C語言里的Struct,可以理解為一些有意義的個體內容的整合。import pandas as pd name=["張三","李四","王二"] age=[28,32,19] data = np.zeros(3, dtype={'names': ('name', 'age'),'formats': ('U10', 'i4')}) data['name']=name data['age']=age #打印結構體的數據內容 print(data) df=pd.DataFrame(data,columns=['name','age'],index=['no_001','no_002','no_003']) print(df)#結果 [('張三', 28) ('李四', 32) ('王二', 19)]name age no_001 張三 28 no_002 李四 32 no_003 王二 19訪問DataFrame
字典方式
#該方式主要是指DataFrame是由字典形式的Series組成的,訪問元素時可以采用字典方式。 #當前需求是僅訪問name列,即顯示所有人的姓名import pandas as pd age={"no_001":28,"no_002": 32,"no_003": 19}name={"no_001":"張三","no_002": "李四","no_003":"王二"}df= pd.DataFrame({"name":name,"age":age})print(df['name'],df.name) #結果 no_001 張三 no_002 李四 no_003 王二 Name: name, dtype: object no_001 張三 no_002 李四 no_003 王二 Name: name, dtype: object二維Numpy數組
#通過Numpy數組的方式創建以學號為索引,含姓名和年齡的學生信息的數據框 import pandas as pd df=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003']) print(df.values)#結果 [['張三' 28]['李四' 32]['王二' 19]]通過loc或iloc訪問
#針對字典方式或二維數組方式創建的DataFrame都可通過loc和iloc方法進行行和列的過濾來訪問數據框里的元素。 #通過loc或者iloc訪問數據框的內容import pandas as pd name=["張三","李四","王二"] age=[28,32,19] data = np.zeros(3, dtype={'names': ('name', 'age'),'formats': ('U10', 'i4')}) data['name']=name data['age']=agedf1= pd.DataFrame(data,columns=['name','age'],index=['no_001','no_002','no_003'])import pandas as pd df2 = pd.DataFrame([["張三", 28], ["李四", 32], ["王二", 19]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003']) print(df1.loc['no_001']) print(df1.loc['no_001']['name']) print(df2.loc['no_001']['name']) print(df2.iloc[1])#結果 name 張三 age 28 Name: no_001, dtype: object 張三 張三 name 李四 age 32 Name: no_002, dtype: object通過loc或iloc過濾
#針對字典方式或二維數組方式創建的DataFrame都可通過loc和iloc方法進行行和列的過濾來訪問數據框里的元素。 #通過loc或者iloc訪問帶過濾條件的數據框內容,這里僅顯示年齡大于30的學生姓名。import pandas as pd name=["張三","李四","王二"] age=[28,32,19] data = np.zeros(3, dtype={'names': ('name', 'age'),'formats': ('U10', 'i4')}) data['name']=name data['age']=agedf1= pd.DataFrame(data,columns=['name','age'],index=['no_001','no_002','no_003'])import pandas as pd df2 = pd.DataFrame([["張三", 28], ["李四", 32], ["王二", 19]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003']) print(df1.loc[data['age']>30,['name']]) #如果第2行里age大于30那么就顯示它的姓名 print(df1.name[df1.iloc[1]['age'] > 30])#結果name no_002 李四 李四通過loc或iloc切片
#可以通過loc或者iloc對數據框進行切片式訪問。 #行切示例,分別以loc或iloc方式僅取出no_002、no_003對應的內容import pandas as pd name=["張三","李四","王二"] age=[28,32,19] data = np.zeros(3, dtype={'names': ('name', 'age'),'formats': ('U10', 'i4')}) data['name']=name data['age']=age df1= pd.DataFrame(data,columns=['name','age'],index=['no_001','no_002','no_003'])import pandas as pd df2 = pd.DataFrame([["張三", 28], ["李四", 32], ["王二", 19]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003']) print(df1.loc['no_002':'no_003']) print(df2.iloc[0:1])#結果name age no_002 李四 32 no_003 王二 19name age no_001 張三 28DataFrame處理缺失值
None填充缺失值
該方式用None來補充缺失值,因為None是空對象,而Numpy、Series、DataFrame都屬于Padans且繼承自Object對象,所以可以被賦值為None,即空對象。
#利用None作為空元素填充到數據框里。 import pandas as pd df2 = pd.DataFrame([["張三", 28], ["李四", 32], [None, 19]], columns=['name', 'age',],index=['no_001', 'no_002', 'no_003']) print(df2) #結果name age no_001 張三 28 no_002 李四 32 no_003 None 19 #注:None不可以參與任何的元素運算,比如None+3是非法的。NaN填充缺失的數值
#通過numpy的NAN方法對缺失、空的數值型進行填充。 import pandas as pd df2 = pd.DataFrame([["張三", 28], ["李四", 32], ["王二",np.nan]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003']) print(df2) print(df2['age'].sum()) #結果name age no_001 張三 28.0 no_002 李四 32.0 no_003 王二 NaN 60.0#1這里的np.nan是float類型。 #2由此可見DataFrame做列的sum時會將NaN值認為是0.0。#這里的NAN可以做運算,比如NaN+3還是NaN。示例如下: import numpy as np vals2 = np.array([1,3, 4,np.nan]) print(vals2.sum()) #結果 nanNull notnull判斷空值
#1 通過isnull來判斷數據框里的列是否有None或者nan的情況 import pandas as pd df2 = pd.DataFrame([["張三", None], ["李四",32 ], ["王二",np.nan]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003']) print(df2.isnull()) #結果name??? age no_001? False?? True no_002? False? False no_003? False?? True #2 同理利用notnull,提取age列不為空的數據。 import pandas as pd df2 = pd.DataFrame([["張三", None], ["李四",32 ], ["王二",np.nan]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003']) print(df2[df2['age'].notnull()]) #結果name?? age no_002?? 李四? 32.0用所在列前值填充空數據
#此種方式是用ffill方法即當前列里為空元素的前一個元素來補充當前為空的元素。 import pandas as pd df2 = pd.DataFrame([["張三", 28,80,1], [None,32,90,2 ], ["王二",np.nan,99,1]], columns=['name', 'age','score','level'],index=['no_001', 'no_002', 'no_003']) print(df2.fillna(method='ffill')) #結果,不難發現no_002的name被no_001的name填充,同理no_003的age被no_002的填充。name age score level no_001 張三 28.0 80 1 no_002 張三 32.0 90 2 no_003 王二 32.0 99 1用所在列后值填充空數據
#此種方式是用bfill方法即當前列里為空元素的前一個元素來補充當前為空的元素。 import pandas as pd df2 = pd.DataFrame([["張三", 28,80,1], [None,32,90,2 ], ["王二",np.nan,99,1]], columns=['name', 'age','score','level'],index=['no_001', 'no_002', 'no_003']) print(df2.fillna(method='bfill')) #結果,不難發現這里no_002的name被no_003的name填充,而因為no_003是最后的記錄,所以無法再被填充,所以age只能還是NaN。name age score level no_001 張三 28.0 80 1 no_002 王二 32.0 90 2 no_003 王二 NaN 99 1用固定值填充空數據
#此種方式即fillna時指定固定的值,比如0或者列的均值等。 import pandas as pd df2 = pd.DataFrame([["張三", 28,80,1], [None,32,90,2 ], ["王二",np.nan,99,1]], columns=['name', 'age','score','level'],index=['no_001', 'no_002', 'no_003']) print(df2.fillna(0)) #結果name age score level no_001 張三 28.0 80 1 no_002 0 32.0 90 2 no_003 王二 0.0 99 1以列方向刪除空值
#這種方式從列這個角度(axis='columns')去刪除為None或者Nan的數據,但凡某一列含有空就刪除該列,輸出列數取決于不含空的列的個數。 import pandas as pd df2 = pd.DataFrame([["張三", 28,80], [None,32,90 ], ["王二",np.nan,99]], columns=['name', 'age','score' ],index=['no_001', 'no_002', 'no_003']) print(df2.dropna(axis='columns')) #結果score no_001 80 no_002 90 no_003 99 #注:axis='columns'等價于axis=1以行方向刪除空值
#這種方式從行這個角度(axis='rows')去刪除為None或者Nan的數據,但凡某一行含有空就刪除該行,輸出列數與原數據的列數一致或者為空。 import pandas as pd df2 = pd.DataFrame([["張三", 28,80], [None,32,90 ], ["王二",np.nan,99]], columns=['name', 'age','score' ],index=['no_001', 'no_002', 'no_003']) print(df2.dropna()) print(df2.dropna(axis='rows')) #結果name age score no_001 張三 28.0 80 #注 1注:axis='rows'等價于axis=0 #2如果不指定axis那么就會從行、列方向做刪除操作。以最小非空閥值刪除空值
#該方式是指定thresh參數以限定行或者列的最小非空的個數,即最小非空閾值。 #當前示例有姓名、年齡、分數、等級4列,3條數據,這里因為設置了最小非空閾值,所以輸出結果里有的列是None或者Nan是正常的。 import pandas as pd df2 = pd.DataFrame([["張三", 28,80,1], [None,32,90,2 ], ["王二",np.nan,99,1]], columns=['name', 'age','score','level'],index=['no_001', 'no_002', 'no_003']) print(df2.dropna()) print(df2.dropna(axis='rows',thresh=3)) #結果 name age score level no_001 張三 28.0 80 1 no_002 None 32.0 90 2 no_003 王二 NaN 99 1總結
以上是生活随笔為你收集整理的Python数据分析pandas之dataframe初识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python数据分析pandas之ser
- 下一篇: 线性代数行列式计算之迭代法