1.1 讀取文件注意:
1)不要嘗試讀取excel文件(不便于解析)蕊程,最好使用通用的csv或者txt格式
2)注意編碼問題,使用excoding參數(shù)
3)注意處理報錯
1.2 DataFrame 和 Series
DataFrame:二維數(shù)據(jù)框(一個or多個Series)
Series:一維有標簽的任意結(jié)構(gòu)(表的一行or一列)
應(yīng)用:
1)將字典導(dǎo)入Series:a={}, pd.Serise(a),將key作為index介返,value作為值保存
a={'name':'grace','age':18,'sex':'female'}
pd.Series(a)
name grace
age 18
sex female
dtype: object
2)傳入列表敌完,并制定索引:g=[],pd.Series(g,index="……")
不制定索引撵术,則自動生成0開頭的索引逮光。
g=[1,3,5,2,4,6]
pd.Series(g,index=list("qwezxc"))
q 1
w 3
e 5
z 2
x 4
c 6
dtype: int64
1.3 常用操作
查看屬性:
1)columns:返回列名
score.columns #列名稱
Index(['省份', '學生ID', '考期', '科目', '分數(shù)', '描述', '是否通過', '小組', '班主任', '學員名稱', '家族', '子訂單id', '預(yù)估分.1', '分數(shù)區(qū)間'], dtype='object')
2)index:返回索引
score.index
RangeIndex(start=0, stop=8868, step=1)
3)dtypes:返回每一列的類型
score.dtypes
省份 object
學生ID int64
考期 int64
科目 object
分數(shù) int64
描述 float64
是否通過 int64
小組 object
班主任 object
學員名稱 object
家族 object
子訂單id int64
預(yù)估分.1 int64
分數(shù)區(qū)間 object
dtype: object
4)shape:返回一個數(shù)據(jù)框有幾行&幾列
score.shape
(8868, 14)
5)size:數(shù)據(jù)框有多少元素:8868*14
score.size
124152
方法使用:
1)head:返回文件前x行(默認5)
2)tail:返回文件倒數(shù)x行(默認5)
3)rename:score.rename(columns={舊名字:新名字})
score.rename(columns={'學生ID':'學員ID'})
4)replace:查找并替換值 score.replace({'列':{'舊名':'新名'}})
score.replace({'學生姓名':{'周亞亭':'周亞婷'}})
5)unique:
score.省份.value_counts() #返回不同值&出現(xiàn)的次數(shù),series 形式
score.省份.unique() #返回不同值 栖秕,numpy 形式
6)sort_values: 根據(jù)指定列進行排序春塌,默認升序&行排序: data.sort_values(['列1','列2','列3'])
data.sort_values(['stu_id','科目名稱','課程名稱'])
7 ) describe:查看數(shù)據(jù)的統(tǒng)計值(計數(shù),標準差簇捍,最值只壳。。暑塑。)
8)max/min/sum/mean :
默認對列求值吼句。對行可以改為 axis=1
*** pandas 中的方法,都是產(chǎn)生新數(shù)據(jù)集事格,不會修改原數(shù)據(jù)惕艳。如果想修改原數(shù)據(jù),可以通過1)賦值 2)參數(shù)設(shè)置:inplace=true
***查看幫助文檔:?score.方法
*** 數(shù)據(jù)選取驹愚、添加远搪、刪除:
9)選擇數(shù)據(jù)
選擇一列:data['課程ID']
選擇多列:data[['課程ID','模塊ID',……]]
10 ) 添加一列:
增加一列class,賦值1:data['class']=1
···
11)刪除一列:
注意逢捺,這里針對列操作谁鳍,用del
···
del data['class'] # del +‘空格’+數(shù)據(jù)框[''列名'']
1.4 處理Missing value
pandas shiyong numpy.nan 代表缺失值,缺失值不會被程序計算劫瞳。處理方式為:
1倘潜、刪除含有缺失值的行;
2志于、填充缺失值
#檢測某一列數(shù)據(jù)是否為空涮因,返回布爾值
pd.isnull(data['模塊ID'])
1、刪除表中含有缺失值的行
1)針對整個數(shù)據(jù)框伺绽,只要某一個元素為空养泡,對應(yīng)的行就被刪除)
data.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
2) 針對列,只要含有空憔恳,就刪除對應(yīng)列
data.dropna(axis=1)
3)針對行:只有所有項均為nan瓤荔,才刪除
data.dropna(how='all')
4)指定nan個數(shù)的行列進行刪除:
data.dropna(axis=1,thresh=3) #將在列的方向上3個為NaN的項刪除
data.dropna(thresh=2) #將在行的方向上2個為NaN的項刪除
5)對指定列含nan的項進行刪除:
data.dropna(subset=['column1'净蚤,‘column2’])
2钥组、填充缺失值:fillna
1)data.fillna(0) #填充0
2)data.fillna(method='pad/ffill') #用前一個值填充空值(向下填充)
3)data.fillna(method='backfill/bfill') #用后一個值填充空值(向上填充)
4)對不同列的空值,用不同的值來填充:
values={'子訂單':111,'課程ID':222,'直播時長min':0}
data.fillna(value=values)
子訂單的空值用111填充今瀑,課程ID用222填充程梦,直播時長空值用0填充
5) 限制填充行:
data.fillna(value=values, limit=1) # 只對第一行進行填充
1.5 文本數(shù)據(jù)
DataFrame 和 Series中常常有文本格式的數(shù)據(jù)存在点把,pandas提供了良好的工具處理這些文本。
1 )刪除空格:str
s=pd.Series(['A','b','C','D ',' Alibaba',' Circel'])
s.str.strip()
1.6 索引
1.6.1 loc 基于索引標簽名稱
- 根據(jù)索引位置選取指定列
data.loc[[1,3,5]]
- 根據(jù)指定列名的列選擇數(shù)據(jù)范圍
data.loc[data['直播時長min']>=60]
1.6.2 iloc 基于索引位置
data.iloc[:5] #這里根據(jù)位置索引屿附,所以返回5條數(shù)據(jù)郎逃。相當于前閉后開。
5 rows × 29 columns
對比:
data.loc[:5] # 這里根據(jù)名稱挺份,選擇到索引名稱為5的列褒翰。所以返回6列。
6 rows × 29 columns
- 指定列設(shè)置為索引: set_index('column_name')
data1=data.set_index('stu_id')
data1.loc[:5] #報錯:因為索引變成了id匀泊,這里根據(jù)索引名稱切片优训,沒有名稱為5的索引
data1.iloc[:5] # 成功,這里按照索引位置選取5行
- 對列進行操作:
選擇某些列[ , [ ? ]]
data.loc[:10,['college_name','學生姓名']]
# 選擇數(shù)據(jù)的前11行(截止標簽為10)各聘,列為'college_name','學生姓名'的數(shù)據(jù)揣非。
data.iloc[:10,[2,3]]
# 選擇數(shù)據(jù)的前10行,列位置為 2,3 的數(shù)據(jù)躲因。這里的2,3是位置早敬,寫為列名會報錯
1.6.3 數(shù)據(jù)過濾
篩選班主任姓名為aaa 的學員數(shù)據(jù)
data.loc[data['班主任']=='aaa']
選擇直播超過30min的或者重播超過30min的選擇出來
data.loc[(data['直播時長min']>=10)|(data['重播時長min']>=30)]
將篩選出來的數(shù)據(jù)新建一個標簽,值為high
data.loc[(data['直播時長min']>=10)|(data['重播時長min']>=30),"flag"]='high'
1.6.4 多重索引
設(shè)置兩層索引
data2=data.set_index(keys=['班主任','授課老師'])
選擇班主任為aaa大脉,授課老師為劉星的數(shù)據(jù)
data2.loc['aaa','劉星']
使用sclice(None)表達在某個level上的選取全部的內(nèi)容搞监,不需要對全部level進行指定。
data2.loc[(['劉星'],slice(None)),:]
第一索引上篩選镰矿,從第二索引不篩選
data2.loc[(['劉星'],slice(None)),:]
第二索引上篩選腺逛,從第一索引不篩選
data2.loc[(slice(None),['夏利']),:]
行列篩選:IndexSlice-一種更接近自然語法的用法,可以替換slice
比如衡怀,選擇夏利老師教授的所有學生和對應(yīng)班主任:
idx=pd.IndexSlice
data2.loc[idx[:,['夏利']],:idx['學生姓名']]
選擇夏利老師教授的班主任為aaa的所有學生:
data2.loc[idx[['aaa'],['夏利']],:idx['學生姓名']]
1.7 分組統(tǒng)計:group by
1.7.1 統(tǒng)計計算
- 單個統(tǒng)計量
- 多個統(tǒng)計量
- 不同列對應(yīng)不同統(tǒng)計量
注意:分組計算很重要的一點:我們每一個統(tǒng)計函數(shù)都是作用在每一個grouped上面棍矛,不是單個樣本,也不是全部樣本抛杨。
單個統(tǒng)計量
df=pd.read_csv(r'/Users/…../movie.csv')
df.head()
grouped=df.groupby('director_name') # 根據(jù)導(dǎo)演的名字進行分組
grouped.size() #多少組够委,每組多少數(shù)據(jù);導(dǎo)演出現(xiàn)時次數(shù)——作品數(shù)量
grouped.groups # 每個分組包含了多少數(shù)據(jù):數(shù)據(jù)以分組形式展示
grouped.mean() #對每一列根據(jù)分組進行求均值
grouped['duration'].sum() #只針對某個特征進行計算
多個統(tǒng)計量計算
利用agg函數(shù)進行多個統(tǒng)計量計算
import numpy as np
grouped.agg([np.mean,np.sum,np.std]) #求出每個組別(導(dǎo)演)對應(yīng)特征的平均數(shù), 總和怖现,標準差
grouped['duration'].agg([np.mean,np.sum,np.std])# 只針對分組后某個特征求均值茁帽,總和,標準差
mean sum std
director_name
A. Raven Cruz 97.000000 97.0 NaN
Aaron Hann 87.000000 87.0 NaN
Aaron Schneider 100.000000 100.0 NaN
Aaron Seltzer 85.000000 85.0 NaN
Abel Ferrara 99.000000 99.0 NaN
不同的列做不同的統(tǒng)計量:
對一特征求均值屈嗤,二特征求和
grouped.agg({'duration':np.mean,'director_facebook_likes':np.sum})
1.7.2 transformation:標準化
標準化之前潘拨,需要對數(shù)據(jù)做缺失值處理。未做處理會出現(xiàn)錯誤值饶号。
缺失值處理:用0填充
df1=df.fillna(0)
grouped=df1.groupby('director_name')
#對某一列做標準化
#定義標準化函數(shù)
z_score=lambda s:(s-s.mean())/s.std()
df1.shape
(5043, 28)
#確定對哪一列進行標準化
grouped[['num_critic_for_reviews','director_facebook_likes','duration']].transform(z_score)
image.png
1.7.3 Filteration對分組后的數(shù)據(jù)做過濾
grouped.filter(lambda g:len(g)>1) #過濾并選擇那些數(shù)據(jù)量大于1的顯示
image.png