Pandas使用細則


本文介紹pandas的使用,總結了我在機器學習過程中常使用到的一些方法等。

#pandas學習
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
# 設置pandas顯示全部行和列,特征較多時使用比較好
pd.set_option('display.max_columns',None)
# pd.set_option('display.max_rows',None)# 這個一般感覺不需要

1,創建數據

1.1 創建一個DataFrame,DataFrame為pandas的數據容器,其實就是數組加上了列名、索引名等。

# 參數data,columns,index
# 方式1
fruit_sales = pd.DataFrame([[35, 21],[41,34]], columns=['Apples', 'Bananas'],index=['2017 Sales','2018 Sales'])
fruit_sales

# 方式2
fruit_sales2 = pd.DataFrame({'Apples':[35,42],'Bananas':[21,34]},index=['2017 Sales','2018 Sales'])
fruit_sales2

 

 以上2種方式結果都一樣:

 

 

 如果不指定index和columns,自動以數字賦值:

1.2,Series。DataFrame是表示多行多列的,其中每一行或每一列都是一個Series。

#Series,只能表示一列數據,多列還是用DataFrame
items=['apple','banana','orange']
nums=[10,12,34]
fruit2 = pd.Series(nums, index=items, name='fruit')
fruit2

結果為:

 

 

 2,讀取/存儲為csv文件,這里以kaggle中Titanic項目訓練數據為示例。

train_data=pd.read_csv('train.csv',index_col=0)# 讀取

train_data.to_csv('train_data.csv')# 存儲

此方法常見參數如下:

filepath_or_buffer:文件目錄地址

index_col:以哪一列作為index

skiprows:跳過開頭多少行

skipfooter:跳過末尾多少行

parse_dates:解析日期,有多種輸入格式,具體參考文檔。建議輸入list,如[1,2,3],表示對第2,3,4列進行日期的解析

encoding:編碼,如中文可用gbk等,如報編碼錯誤請檢查這個。

3,數據概覽及操作

3.1 主要方法為describe,info,head,columns,index,values等

  • head
train_data.head()#查看開頭幾行,默認5

  • describe
train_data.describe()#查看描述信息,默認只對數值列起作用,你可以像第二行一樣包含所有,或指定一個list的列
#train_data.describe(include='all')

 

 

 以上,有統計數量,最大最小,平均值,標准差,以及若干百分位的值(百分比可用list指定)

  • info
train_data.info(verbose=True,null_counts=True)#查看各列數據類型,null值數量等

 

 

  • 查看shape,類型,行,列

# 維度
train_data.shape
# size為shape 2個維度乘積
train_data.size

# DataFrame轉np array
train_data.values# 即可

# 獲取所有列名,行index
train_data.columns/index

# 查看所有數據類型
data.dtypes

# 一列或多列(多列時給個list)
ages=train_data.Age
ages=train_data['Age']

# 一行或多行
# 這2個相同
first_row=train_data.loc[0]
first_row=train_data.iloc[0]

# 多個行時不同
rows=train_data.iloc[1:3]# 第2,3行
rows=train_data.loc[1:3]# 第1,2,3行


# 同時篩選行和列。前面是選取的行,后面是選取的列
train_data.iloc[[1,2],[1,2]]
train_data.iloc[1:2,1:2]

3.2 復雜查詢

#聯合查詢
a=train_data.loc[train_data.Pclass.isin([1,2]) & (train_data.Age<=30)]
#中位數
train_data.Age.median()
#平均值
train_data.Age.mean()
#查看該列包含種類(相當於set操作)
train_data.Pclass.unique()
#統計該列各個種類的數量(統計set后各元素出現的次數)
train_data.groupby('Pclass').size()# 結果按索引排序
train_data.Pclass.value_counts()# 這種方式更好,結果是按值排序的
#票價與年齡的比例,求比例最大的行號
idx=(train_data.Fare/train_data.Age).idxmax()
#查看此人是否存活
train_data.loc[idx,'Survived']
# 統計指定列為NaN的行數
train_data[train_data.Embarked.isna()]
# 統計指定列某條件下的行數
(train_data['Age']<50).sum()
# 統計所有Ticket中出現PC的次數
train_data.Ticket.map(lambda ticket:'PC' in ticket).sum()

3.3 數據操作

  • DataFrame合並
# DataFrame合並
df1=pd.DataFrame(data={'price':[6,6.5,7],'count':[10,9,8]})
df2=pd.DataFrame(data={'name':['a','b'],'married':['Yes','Yes'],'price':[1,2]})
# 列名不同的添加列,相同列名的合並,數據按行合並
df=pd.concat([df1,df2],sort=False)

# 以2個df中指定列進行合並,合並的列名不必相同(此時第一列的列名為空),如果相同則作為index並將index排序
df1=pd.DataFrame(data={'price':[6,6.5,7],'count':[10,9,8],'sth':[2,3,4]})
df2=pd.DataFrame(data={'name':['yanfang','chenlun'],'married':['Yes','Yes'],'price':[1,10],'sth':[2,8]})

# 默認合並方式為left,即df1合並列(price,3)有多少行,結果就是多少行
# 除合並的列外,2個df不允許再出現同名的列
df=df1.set_index('price').join(df2.set_index('sth'),how='outer',sort=False)
# df=df1.set_index('price').join(df2.set_index('price'),how='outer',sort=False) 不允許重復列sth
  • DataFrame屬性修改
# 改變某列的數據類型,如將Age通過cut分段后,它的數據類型為categorical,而你想做PCA降維,那么只能轉化為數值型
train_data['Age_bin']=train_data['Age_bin'].astype('float')
# 重命名列
data=data.rename(columns=dict(Pclass='Class',Fare='Ticket_price'))
# 重命名index
data=data.rename_axis("Id",axis=0)# 注意axis=1也可行,此時並未重命名index,而是將index作為一列,給予它一個列名
  • groupby 分類(查詢)
# groupby分類
df=pd.DataFrame(data=[[20,7],[10,11],[10,8],[20,12],[9,8]],columns=['price','points'])
# 輸出各價錢對應的最高分數
df.groupby('price')['points'].max().sort_index(axis=0)#對於Series,它只有一列數據,axis必須為0
#
agg:以多個函數操作的結果作為各個列 both=df.groupby('price').points.agg([min,max]) both

 

 

  •  聯合排序
# 多個列的排序
data=train_data.iloc[:10,4:6]
data.sort_values(by=['Age','SibSp'])

  • 數據修改
# map修改數據,apply是另一個修改方法
train_datan['Ticket']=train_data.Ticket.map(lambda ticket:'PC' in ticket)# 變為布爾類型

# 增加列:將Age按年齡段分類,此時該列的數據類型為categorical
train_data['Age_bin']=pd.cut(train_data['Age'],bins=[0,25,40,55,95],labels=[1,2,3,4])
# get_dummies對類別型的列做one-hot處理,之后我們就可以如下查看相關系數了
data_show=pd.get_dummies(train_data,columns=['Age_bin'])
sns.heatmap(data_show.corr(),annot=True,cmap='RdYlGn',linewidths=0.2)

# 缺失值處理:之前的map,apply,以及此處的fillna,replace等都可以修改數據。
# 以中位數填充None/NaN值
train_data.Age.fillna(train_data.Age.median(),inplace=True)
# 如果該列缺少太多數據,可直接原地(inplace)刪除該列
train_data.drop(['Age'],axis=1,inplace=True)
# 使用replace替換屬性中的值
train_data.Age.replace(28,30)

4 可視化

df可以直接用matplotlib可視化

train_data['Age'].hist()# 統計各個年齡的數量,作直方圖

 

 

 

 

 


免責聲明!

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



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