1.對列進(jìn)行重命名
兩種方法:
- rename
df.rename(columns={})
注意兩點(diǎn),columns這個(gè)參數(shù)名不能丟,columns后邊跟字典,想改哪個(gè)改哪個(gè) - .columns
dfname.columns = []
注意兩點(diǎn),是個(gè)列表,列表必須包含所有的列名字
總結(jié),只改幾個(gè)名字用rename,都改用.column
2.根據(jù)列的值篩選數(shù)據(jù)
- df[]
中括號里邊寫條件,寫相等的條件的時(shí)候用==,當(dāng)然也可以寫>、<、!=這些符號,有很多個(gè)條件用&連起來。這里記得多個(gè)條件用&就行。
df[df['c1']==1 & df['c2']==1]
3.字符串轉(zhuǎn)為日期
有一個(gè)最好用的函數(shù),pd['字段名'].to_datetime()直接轉(zhuǎn)換為日期格式,但是使用這個(gè)函數(shù)的前提是你的字段是一個(gè)日期格式的字符串。
這個(gè)轉(zhuǎn)換的好處是,可以直接用.dt屬性了,里邊包裝了很多函數(shù),比如:獲取年份,月份,日期,小時(shí),甚至今天是周幾等等。
然后還可以直接兩列相減,轉(zhuǎn)化為你需要的時(shí)間刻度,比如兩個(gè)事件相隔幾秒,幾分鐘,幾小時(shí)。
注意點(diǎn)是,to_datetime()可以設(shè)置日期的格式,怎么設(shè)置的話,參考下面這個(gè)例子,其他怎么設(shè)置以此類推吧。
format ='%Y-%m-%d'
format = '%Y-%m-%d %H:%M:%S'
這里需要注意,我們都知道python字符串的日期函數(shù)strftime和strptime,當(dāng)你轉(zhuǎn)換為dt以后你就可以使用這兩個(gè)函數(shù)進(jìn)行自由的字符串和日期格式轉(zhuǎn)換,但是前置任務(wù)一定是轉(zhuǎn)換為datetime類型。
4.刪除列或者行的數(shù)據(jù)
有兩種方案,del和drop
- del,del后邊接數(shù)據(jù)框,del df['column1'],這個(gè)方法只能刪除列,不能刪除行。
- drop,drop是一個(gè)函數(shù),df.drop('column1',inplace=True)
注意一點(diǎn),inplace這個(gè)參數(shù),如果設(shè)置為True,那么將直接在數(shù)據(jù)框上修改。
這個(gè)函數(shù),行列通吃,不過要?jiǎng)h除行的時(shí)候需要指定index = [],要注意的是如果是默認(rèn)的index(數(shù)字),千萬不要加引號,否則報(bào)錯(cuò)。
df.drop([0,1])可以,但是df.drop(['0','1'])不行
5.選擇某行某列的數(shù)據(jù)
這個(gè)不是按行或者按列選取數(shù)據(jù),而是選取某行某列的具體數(shù)據(jù)。本來有三個(gè)方法,后來ix這個(gè)不讓用了,省事了。用loc和iloc就可以。
- iloc,為啥加個(gè)i,因?yàn)槭前凑账饕齺淼?,就是說是數(shù)字是標(biāo)號,不是名字。
- loc, 這個(gè)就是按照名字來的。
隨便舉個(gè)例子
data = [[1, 2, 3], [4, 5, 6]]
index = ['a', 'b']
column = ['left', 'center', 'right']
table = pd.DataFrame(data=data, index=index, columns=column)
- 例子1
table.iloc[0:1,1],輸出a 2
-例子2
table.loc[['a','b'],'left']
輸出:
a 1
b 4
6.對列元素進(jìn)行操作
兩種方法,一種是針對數(shù)字的to_numeric(),一種是針對所有類型的。
- to_numeric(),轉(zhuǎn)換為數(shù)字格式。
tmp['_score'] = tmp['_score'].apply(pd.to_numeric)
- astype(),這個(gè)是強(qiáng)制轉(zhuǎn)換,想轉(zhuǎn)什么轉(zhuǎn)什么
7.使用聚合函數(shù)
這個(gè)真的是最常用的,你可以想到的應(yīng)用場景統(tǒng)計(jì)某一個(gè)類別下有多少量,統(tǒng)計(jì)一下平均單價(jià),統(tǒng)計(jì)一下環(huán)比和同比增長,統(tǒng)計(jì)一下累積增加值等等,pandas都有函數(shù)可以用。在使用的時(shí)候需要配合一些函數(shù)來用,比如apply、agg、applymap。
- 直接用聚合函數(shù),比如.sum,.avg,這個(gè)沒啥好說的
- apply函數(shù)
apply函數(shù)只能對待處理的列使用相同的函數(shù),比如apply(np.sum,np.avg),注意應(yīng)用這類函數(shù)加個(gè)np,要不然報(bào)錯(cuò),其實(shí)就一列數(shù)據(jù)用這種聚合函數(shù)沒有意義,一般后邊接個(gè)lambda函數(shù)。
apply可以對整個(gè)dataframe使用,也可以單獨(dú)對某一列使用,對整個(gè)dataframe是要按行列聚合的,區(qū)別于applymap,其他差不多。 - map函數(shù)
map函數(shù)是python自帶的,其作用就是對元素應(yīng)用某個(gè)函數(shù),可以接受的參數(shù)包括一個(gè)函數(shù)(可自定義)、或者一個(gè)映射關(guān)系的字典。
map這個(gè)函數(shù)只能對某一列或行的元素使用。 - applymap函數(shù)
applymap函數(shù)對每一個(gè)元素都起作用,這個(gè)函數(shù)倒是可以對整的dataframe使用,但是始終是對元素進(jìn)行操作的。 - agg函數(shù)
agg這個(gè)函數(shù)和apply用法一樣,它比較厲害的地方在于可以用一個(gè)字典做參數(shù),定義每一個(gè)字段使用的聚合函數(shù),比方說:df.agg({'ext price': ['sum', 'mean'], 'quantity': ['sum', 'mean'], 'unit price': ['mean']})
8.groupby操作
groupby的作用是按照某個(gè)字段進(jìn)行分組,這個(gè)語法本身并不難,但是寫法比較多,容易弄混。
- dfname.groupby().ziduan.sum()
推薦寫法,都按照這個(gè)方法寫不容易弄混。groupby括號里直接寫column的名字,如果是多個(gè)字段分組,用中括號擴(kuò)起來。然后要統(tǒng)計(jì)的字段直接用點(diǎn)接上,如果好幾個(gè)字段,加個(gè)apply或者agg也行。 - dfname[ziduan].groupby(dfname[]).sum()
這個(gè)寫法直接把要統(tǒng)計(jì)的字段寫在前邊,groupby的時(shí)候要把dfname再寫上否則報(bào)錯(cuò)。
groupby以后這個(gè)dataframe的index就變了,需要reset_jndex一下才行。
9.計(jì)數(shù)操作
為啥把這個(gè)拿出來說呢,因?yàn)橛?jì)數(shù)的需求很迷,和sum、avg完全不一樣,比較常見的其實(shí)就兩個(gè)需求。
- 統(tǒng)計(jì)某一列有幾個(gè)元素(去重)
為啥去重,不去重沒啥意義啊,不多說(比如說useid這個(gè)字段有幾個(gè)不同的值)。
df.col1.drop_duplicated().count()
df.col1.nunique()
個(gè)人覺得優(yōu)先使用第二個(gè)函數(shù),然后這個(gè)還有個(gè)unique會把元素都給你返回來。 - 統(tǒng)計(jì)某一列某個(gè)元素出現(xiàn)幾次
df.col1.value_counts()
10.na值處理
兩個(gè)函數(shù),dropna,fillna。里邊參數(shù)自由組合,可以實(shí)現(xiàn)各種需求。
11.數(shù)據(jù)框的合并
可選的函數(shù)有merge、concat、join等。
- concat
最簡單的連接函數(shù),就是按行或者列進(jìn)行拼接,按行就是axis = 0,按列就是axis = 1,默認(rèn)是按行進(jìn)行拼接。
df1 = pd.DataFrame({'city': ['Chicago', 'San Francisco', 'New York City'], 'rank': range(1, 4)})
df2 = pd.DataFrame({'city': ['Chicago', 'Boston', 'Los Angeles'], 'rank': [1, 4, 5]})
pd.concat([df1,df2])
pd.concat([df1,df2],axis=1)
這里兩個(gè)地方容易犯錯(cuò):
你要拼接的兩個(gè)df沒有用中括號括起來,pd.merge(df1,df2);
你用df去調(diào)用merge函數(shù),df1.merge(df2)。
- merge
這個(gè)函數(shù)最接近于sql里的join,功能類似,參數(shù)多,挑重要的說。 - on
按照哪個(gè)鍵join,可以是一個(gè)也可以是多個(gè),當(dāng)然不寫的話就按公共的鍵join,寫多個(gè)的話用()括起來。 - how
什么連接方式,left,right還是outer,inner,不寫的話就是inner。 - left_on,right_on,left_index,right_index
設(shè)置左右的dataframe按照什么列名進(jìn)行連接,index就是說按照索引名進(jìn)行連接。 - suffixes
這個(gè)參數(shù)就是說左右的列名一樣了,你怎么處理,加什么后綴區(qū)分。
data1=pd.DataFrame([{"id":100,"name":'lxh','cs':10},{"id":101,"name":'xiao','cs':40},{"id":102,"name":'hua2','cs':50}])
data2=pd.DataFrame([{"id":0,"name":'lxh','cs':10},{"id":0,"name":'lxh','cs':10},{"id":101,"name":'xiao','cs':40},{"id":102,"name":'hua2','cs':50}])
pd.merge(data1,data2,on='name',how = 'left')
- join
前邊說了merge類似于sql里的join,那么pandas里多設(shè)置一個(gè)join是要干嘛。
首先說join的很多參數(shù)和merge是一樣的,區(qū)別就是,join以index作為連接鍵,默認(rèn)選擇的連接方式是left,還有一處比較特別的是它可以一次join多個(gè)dataframe,而merge是不可以的。
merge和join都可以把dataframe寫在前邊,也就是可以df1.join,df1.merge,我覺得關(guān)于這兩個(gè)直接用merge就行。