一、數據讀取
1. pandas 數據讀取:
import pandas as pd df = pd.read_csv("G:\\...\\NBA.csv",encoding='gbk')
read_csv 的重要參數:
filepath_or_buffer: # 文件的路徑,URL或任何具有read()方法的對象。 sep : # 分隔符,默認為 , header: # 列名 , 默認為 header=0 取第0行做為數據集的列名 names: # 指定數據集的列名稱,配合header=None 使用 encoding: # 編碼格式 na_values:["Nope , ..."] # 數據集中的字符串"Nope"被識別為NaN , ... keep_defalut_na: # 如果指定了na_values,並且keep_default_na是False默認的NaN值被覆蓋 na_filter: # 默認True,對缺失值進行檢測,False為不處理。 error_bad_lines: # 默認True,如果False,跳過錯誤行數據 warn_bad_lines: # 默認True,如果error_bad_lines為False,而warn_bad_lines為True,則會輸出每個“壞行”的警告
2、Missing data 處理
DataFrame.dropna() # 返回沒有NaN值的數據集 DataFrame.fillna(X) # 將X填充到數據集中的NaN值 DataFrame.replace([to_replace, value, ...]) # 將to_replace 替換為 value , # 例子: df.replace(np.nan,'xx',regex=False) # 將NaN值替換為xx , regex 若為True 將to_value 當作正則進行匹配!
二、DataFrame與Series
1、DataFrame 是一個表格型數據結構,既有行索引又有列索引,看作由Series組成的字典。
df = pd.read_csv("G:\\....\\NBA.csv",encoding='gbk')
重要方法:
查看: head([n]) # 返回前n行 tail([n]) # 返回最后n行 df[' 列名 '] # 返回某一列的數據 df.列名 # 返回某一列的數據 添加 / 修改整列 : df[' 列名 '] = 'xxx ' # (添加/修改) 一列,內容為xxx 刪除: del df[' 列名 '] # 刪除某一列 df.pop('列名') # 返回項目並從DataFrame中刪除 列運算: df[col3] = df[col1] + df[col2] 判斷: df[ ' 列名 ' ] > 100 # 符合顯示 True , 否則False
重要屬性:
1.index
df.index # RangeIndex(start=0, stop=3922, step=1) # 3922文件總行數 ,
2.columns 返回列名
df.columns # Index(['序號', 'Player', 'height', 'weight', 'collage', 'born', 'birth_city','birth_state'],dtype='object')
3.shape
df.shape # (3922, 8) 數據集一共3922行,8列
4.dtypes 返回每一列數據類型
df.dtypes # 序號 int64 # Player object # height float64 # weight float64 # collage object # born float64 # birth_city object # birth_state object # dtype: object
行選取
1.切片
df[:5] 或 df [10]
2.特殊的索引選取方式
df.iloc[0] # 返回索引為0的行信息
2、Series 一維數組對象,由一組數據和與之相關的數據標簽(索引)組成。
series = df['列名'] series = df.列名 # 篩選 s2 = series[ series > 100 ] # 返回大於100的數據集
屬性:
series.index series.value
方法:
series.value_counts() # 出現頻數 series.unique() # 返回對象中的唯一值的np.ndarray。 len( series.unique ) # 查看長度
3、創建DataFrame 與 Series
1、創建Series
# 1. 字典形式 : sdata = {"A":'123',"B":'456'} series1 = pd.Series( sdata ) # 2. 數組形式 : series2 = pd.Series([1,2,3,4,5] ) # 默認索引從0 開始, ... series2 = pd.Series([1,2,3,4,5] , index = ['a','b','c','d','e'] ) series2 = pd.Series([1,2,3,4,5] , index = list('abcde') ) # 3. 實數形式 : series3 = pd.Series(11 , index = list('abc') )
2、創建DataFrame
# 1. 字典形式 # 一層字典: data = { 'state':['Ohio','Nevada','Ohio'], 'year':[1999,1888,1777], 'pop':[1.4,1.2,1.1] } df1 = pd.DataFrame(data) # 列名:pop,year,stats(亂序) , 行索引默認從0開始 df1 = pd.DataFrame(data , columns = ['pop','year','stats']) # 指定數據表中列名順序 df1 = pd.DataFrame(data , index = ['one','two','three'] ) # 指定索引 # 兩層字典: data = { 'A':{'user':'alex','age':20}, 'B':{'user':'eric','age':10}, } df2 = pd.DataFrame(data) # 外層字典的key作為列 , 內層key作為行索引 df2 = pd.DataFrame(data , index = ['user','age']) # 顯式指出行索引 # 2. 二維數組 arr = [ [1,2,3,4] , [5,6,7,8] ] pd.DataFrame(arr)
3、Series =》 DataFrame
pd.DataFrame(Series)
三、分組 GroupBy
df2 = pd.read_csv("G://..../pokemon.csv",encoding='gbk') g1 = df2.groupby(['Type 1' , ... ])
重要屬性:
1.groups 返回dict {group name -> group labels} , 分組里每個組對應的索引項列表
重要方法:
1.first() 返回組中每一列的第一個值(非NaN)
2.size() 返回分組中類型的個數
3.describe() 生成各種匯總統計,不包括NaN值
4.get_group('xxx') 獲取該分組下所有項內容
Aggregation:
# 方式一 : g1.sum() # 方式二 : import numpy as np g1.agg(np.sum) # 方式三 : g1.agg(np.sum)[' 列名 '] # 單獨計算某一列 g1[' 列名 '].agg(np.sum) # 多重計算 : g1.agg([ np.sum,np.mean,np.std,... ]) # 每一列 都使用不同統計量 (字典) g1.agg( {"HP":[np.sum,np.mean],"Attack":np.std} ) # 重新命名返回的列 xxxx.rename(columns = {"HP":'aaa',"Attack":"bb"})
Transformation :
-
Transform返回發數據集與原數據集大小一樣
-
每一個函數都是對每一個group進行的操作,不是全部的數據集
-
不會改變原有group的數據,返回的是新數據
-
每個函數是作用在每個group里面的column上
f = lambda s : ( s - s.mean() ) / s.std g1.transform( f ) # transform 計算非字符型變量
Filtration :
-
作用於整個group上 或者 作用於某個列
-
返回DataFrame
df = g1.filter(lambda s : len(s) >= 80 ) # 分組內項總數大於80 df = g1.filter(lambda s : np.mean(s['HP']) >= 60 ) # 分組中HP平均值大於60