【python】-2 pandas

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铁追,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子茫船,更是在濱河造成了極大的恐慌琅束,老刑警劉巖扭屁,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涩禀,居然都是意外死亡料滥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門艾船,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葵腹,“玉大人,你說我怎么就攤上這事屿岂〗刚幔” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵雁社,是天一觀的道長浴井。 經(jīng)常有香客問我,道長霉撵,這世上最難降的妖魔是什么磺浙? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮徒坡,結(jié)果婚禮上撕氧,老公的妹妹穿的比我還像新娘。我一直安慰自己喇完,他們只是感情好伦泥,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锦溪,像睡著了一般不脯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刻诊,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天防楷,我揣著相機與錄音,去河邊找鬼则涯。 笑死复局,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的粟判。 我是一名探鬼主播亿昏,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼档礁!你這毒婦竟也來了角钩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彤断,沒想到半個月后野舶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體易迹,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡宰衙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了睹欲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片供炼。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窘疮,靈堂內(nèi)的尸體忽然破棺而出袋哼,到底是詐尸還是另有隱情,我是刑警寧澤闸衫,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布涛贯,位于F島的核電站,受9級特大地震影響蔚出,放射性物質(zhì)發(fā)生泄漏弟翘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一骄酗、第九天 我趴在偏房一處隱蔽的房頂上張望稀余。 院中可真熱鬧,春花似錦趋翻、人聲如沸睛琳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽师骗。三九已至腔彰,卻和暖如春晌柬,著一層夾襖步出監(jiān)牢的瞬間半开,已是汗流浹背凌摄。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工憋活, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留取视,地道東北人糠惫。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓拉盾,卻偏偏與公主長得像靴患,于是被迫代替她去往敵國和親仍侥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容