pandas常用函數(shù)匯總

pandas官方文檔:http://pandas.pydata.org/pandas-docs/stable/api.html

對常用函數(shù)做了匯總,每個函數(shù)的參數(shù)可能不是全的,但是常用的,不常用的沒總結(jié),如有問題,請不吝賜教,謝謝!

一、Series

1、創(chuàng)建Series

? ? ? 通用函數(shù):pd.Series(values,index)

? ?? 1)pd.Series([1,2,3],index=[‘a(chǎn)’,‘b’,‘c‘])

? ?? 2)pd.Series(np.array([1,2,3]),index=[‘a(chǎn)’,‘b’,‘c‘])

? ?? 3)pd.Series({ 'a':1,? 'b':2,? 'c':3})

? ? ? ? Series轉(zhuǎn)字典:Series.to_dict()

? ?? 說明:Series的values參數(shù)是python中常見的一維數(shù)據(jù)類型。

2、屬性

? ?? 1)Series.values --->array([1,2,3])

? ? ? ? ?? Series的values是array類型

? ?? 2)Series.index--->index([‘a(chǎn)’,‘b’,‘c‘])

? ? ? ? ?? 未指定index時,自動生成 0-(N-1)的整數(shù)索引,

? ? ? ? ?? 指定 index時,使用指定索引。

?3、Series的索引與切片

? ? ?? Series[0] / Series['a']? : Sereis可以位置索引或標(biāo)簽索引,也可以進行切片操作

二、DataFrame

1、創(chuàng)建DataFrame

? ? 1) 創(chuàng)建DataFrame的通用函數(shù):

? ?? df = pd.DataFrame(values,index,columns)

? ?? pd.dataFrame([[1,2,3],[4,5,6],[7,8,9]],index=['a','b','c'],columns=['bj','sh','sz'])

? ?? pd.dataFrame(np.arange(1,10).reshape(3,3),index=['a','b','c'],columns=['bj','sh','sz'])

? ?? pd.dataFrame('bj':[1,4,7],'sh':[2,5,8],'sz':[3,6,9],index=['a','b','c'])

說明:創(chuàng)建方法與Sries類似,Series的values參數(shù)是python中常見的一維數(shù)據(jù)類型,DataFrame的values參數(shù)是python中常見的二維數(shù)據(jù)類型。

? ? 2) 通過網(wǎng)頁中復(fù)制數(shù)據(jù)快捷創(chuàng)建

? ? ? ? import webbrowser

? ? ? ? link = 'https://www.tiobe.com/tiobe-index/'

? ? ? ? webbrowser.open(link)

? ? ? ? 打開界面進行復(fù)制,將數(shù)據(jù)復(fù)制到粘貼板中

? ? ? ? df = pd.read_clipboard() ? #從粘貼板中讀取數(shù)據(jù)

? ? 3)通過Series創(chuàng)建DataFrame

? ? ? ? df = pd.DataFrame([s1,s2,s3],columns=['bj','sh','sz'])

? ? ? ? 注意:單獨的s1,s2,s3是縱向排列的的Series,但是在DataFrame中是橫向排列的。

? ? ? ? 自己總結(jié):Series除了打印出來是Series格式外,其他時候可以直接當(dāng)作list來操作。

2、屬性

? ?? 1)df.columns

? ? ? ? 通過columns生成新的DataFrame

? ? ? ? df_new = pd.DataFrame(df,columns=['x1','x2'])

? ? ? ? 或者df_new = df[['x1','x2']]

? ? 2)df.shape? 顯示行列數(shù)

? ? 3)df.head() ? 默認顯示前5行

? ? 4)df.tail() ? ? 默認顯示后5行

3、獲取DataFrame的列

? ?? 1)獲取DataFrame某一列

? ? ? ? ? df.x1或df['x1']:返回值是Series,可以理解為一個DataFrame是由多個Series組成的。

? ? ? 2) 獲取DataFrame某幾列

? ? ? ? ? df_new = df[['x1','x2','x3']]

4、為某列賦值

? ? ? 1) df['x1'] = range(10)

? ? ? 2) df['x1'] = numpy.arange(10)

? ? ? 3) df['x1'] = pd.Series(np.arange(10))

? ? ? 說明:類似于創(chuàng)建Series

?5、為某列對應(yīng)的特定行重新賦值

? ? ? ? df['x1'] = pd.Series([2,3],index=[0,1])

? ? ? ? 將列為x1,行索引為0和1的值改為2,3

?6、獲取DadaFrame的行

? ? ? for row in DataFrame.iterrows():

? ? ? ? ? ? ? print(row[0],row[1])

? ? ? #每個row是一個元祖,包含2個元素,row[0]是整型索引,row[1]是Series,所以從行的角度也可以看出,一個DataFrame是由多個Series組成的。

?7、DataFrame的轉(zhuǎn)置

? ? ? df_new = df.T

三、DataFrame的IO操作

1、粘貼板的io

? ? ? df = pd.read_clipboard()

? ? ? df.to_clipboard()

?2、csv的io

? ? ?? df.to_csv('xxx.csv')

? ? ?? df = pd.read_csv('xxx.csv')

? 3、json的io

? ? ?? df.to_json()

? ? ?? pd.read_json(df.to_json())

?? 4、excel的io

? ? ? ? df.to_excel('xx.xlsx')

? ? ? ? df = pd.read_excel('xx.xlsx')

?? 5、df = pd.read_sql('')

? ? ? ? df.to_sql('')

四、DataFrame的切片操作

?1、iloc

? ? ? sub_df = df.iloc[10:20,:]? 選取DataFrame的10-20行,所有列數(shù)據(jù)

? ? ? sub_df = df.iloc[10:20,0:2]

? ? ? 說明:iloc函數(shù)是位置索引,與索引的名字無關(guān)。

?? 2、loc

? ? ? sub_df = df.loc[10:20,:'movie_name']

? ? ? 說明:loc是標(biāo)簽索引,10,20,'movie_name'? 都是索引名字,與位置無關(guān)。

五、Series和DataFrame的reindex

1、Series.reindex(index=['x1','x2','x3'],fill_value=10)

? ? ? 將df重新索引,并且將NaN空值用10進行填充

2、Series.reindex(index=range(15),method='ffill')

? ?? 前項填充,后面的值用前面的值進行填充

? ?? 通過reindex想到,如果想新增一個空列或者空行,可以用reindex方法,同樣地,想減少某些行或者某些列,也可以用reindex方法。

六、Series和DataFrame的drop

? ? ? 繼reindex之后刪除行列的函數(shù)操作

? ? ? Series.drop('A') ? #刪除'A'所對應(yīng)的值

? ? ? DataFrame.drop(label,axis)?

? ? ? label可以是行名也可以是列名,label是行的話axis是0,label是列的話axis是1。

? ?? ** 刪除行還可以用 del df['A']

七、NaN(not a number)

nan是numpy的一種數(shù)據(jù)類型,np.nan,float類型

任何數(shù)據(jù)與nan的運算結(jié)果都是nan

1、nan in Series

? ? ? Series.isnull()? -->返回value為True或者False的Series

? ? ? Series.notnull()? -->返回value為True或者False的Series

? ? ? Series.dropna()? -->返回刪除nan值后的Series

? ? ? Series.fillna(method='ffill')? -->前項插值,按照前面的值填充后面的空值

2、nan in DataFrame

? ? ? df.isnull()? -->返回value為True或者False的DataFrame

? ? ? df.notnull()? -->返回value為True或者False的DataFrame

? ? ? df.dropna(axis=0/1,how='any/all',thresh=None)

? ? ? 說明:axis表示刪除行為nan或者列為nan;

? ? ? ? ? ? ? ? any表示只要有一個為空,all表示行中的每個元素或者列中的每個元素為空;

? ? ? ? ? ? ? ? thresh是閾值的意思,表示某行或者某列nan的個數(shù)達到閾值的個數(shù)時才刪除該行或該列。

? ? ? df.fillna(value=1)? --->所有的空值都填充為1

? ? ? df.fillna(value={0:0,1:1,2:2}) --->將0列的空值填為0,1列的空值填為1,2列的空值填為2,默認為填充列

? ? ? 注意:fillna和dropna的特點,生成新的DataFrame,原來的DataFrame不變。

八、多重索引--目前用的比較少,不太熟

1、多重索引介紹

? ?? Series = pd.Series(np.random.randn(6),index=[['1','1','1','2','2','2'],['a','b','c','a','b','c']])

? ? '1','2'為一級索引,'a','b','c'為二級索引

? ? df 可以看做是索引的'1','2'的Series

? ? Series['1']? -->Series

? ? Series['1']['a']? -->value

? ? Series[:,'a'] -->選擇'1'和'2'中的'a'對應(yīng)的值

2、多重索引格式轉(zhuǎn)為二維DataFrame

? ? df = Series.unstack() -->轉(zhuǎn)為二維DataFrame

3、多重索引在DataFrame中的操作

九、mapping和replace

1、 map函數(shù)與apply函數(shù)、applymap函數(shù)的區(qū)別:

? ? ? 1)map函數(shù)對Series中的每個元素作用;

? ? ? 2)applymap函數(shù)對DataFrame中的每個元素作用;

? ? ? 3)apply函數(shù)對對DataFrame和Series的一列做整體運算。

2、Series.replace(to_replace=[2,3,4],values=[20,30,40])? 替換Series中多個值

? ? Series.replace({1:10,2:20})? 將索引為1的值替換為10,將索引為2的值替換為20

十、運算

? ? df.sum()? -->默認按照列進行求和,nan的值被忽略

? ? df.min()? -->默認按照列求最小值

? ? df.max()? -->默認按照列求最大值

? ? df.mean()? -->默認按照列求平均值

? ? df.describe()? -->默認按照列進行描述

? ? df.sum(axis=1)? -->按行求和,nan的值被忽略

? ? #axis=0表示對橫軸進行操作,但是運算中表現(xiàn)為縱軸操作

? ? #axis=1表示對縱軸進行操作,但是運算中表現(xiàn)為橫軸操作

十一、分箱操作

?bins = [0,59,70,80,100],bins是分割范圍

?score_cat = pd.cut(Series,bins)? --->得到catgory類型的數(shù)據(jù)

?DataFrame的分箱技術(shù)很棒啊!

?pd['catgory'] = pd.cut(df['a'],bins=[0,59,70,80,100],labels=['low','ok','good','great'])

?-->新增一列,將a列的值按照labels進行分類標(biāo)記,good!!!

?#生成長度為3的隨機字符串? pd.util.testing.rands(3)

十二、分組操作

1、按照一列分組

? ? ? g = df.groupby('city')

? ? ? g是分組類型數(shù)據(jù),打印不出來,所以看不到,但是有屬性和方法可以間接的了解

? ?? 1) g.groups? -->得到分的幾個組,和每個組包含的索引

? ?? 2)g.get_group('BJ')? -->得到'BJ'所對應(yīng)的組

? ?? 3)groupby = split +apply +combine

? ? ? ? ?? g.mean()? -->求每組的平均值

? ? ? ? ?? g.max() ? -->求每組的最大值

? ? ? ? ?? g.min() ? -->求每組的最小值

? ? ? ? ?? g.count()

? ? ? ? ?? g.describe()

? ? ? 4)g是一個可迭代對象,可以用list函數(shù)將其轉(zhuǎn)化為list

? ? ? ? ? list(g) -- > [('組名1',DataFrame1),('組名2',DataFrame2),(),()]

? ? ? ? ? dict(list(g))? -->將其轉(zhuǎn)化為字典

? ? ? 同時可以通過for循環(huán)進行遍歷操作:for item,desc in g:print(item,desc)

? ? ? #怪不得分組后不是DataFrame,因為元組的第一個元素是'分組名'。

2、按照多列分組

? ? ? g_new = df.groupby(['city','wind'])

? ? ? 得到生成器((('分組1','分組2'),DataFrame),(),()...)

? ? ? g_new.get_group(('分組1','分組2'))

? ? ? for (name_1,name_2),group in g_new:

? ? ? ? ? ? ? print((name_1,name_2),group)

十三、數(shù)據(jù)聚合

?g.mean()? -->求每組的平均值

?與g.agg('mean')方法一樣

十四、透視表

pd.pivot_table(df,index=['',''],aggfuc='sum',values=['',''])

index是分組的組名,values是透視表呈現(xiàn)結(jié)果的列,columns是values下的分解

#感覺透視表呈現(xiàn)的結(jié)果就是groupby+agg后的結(jié)果

#分析者需要對數(shù)據(jù)結(jié)構(gòu)有一定的了解

十五、其他函數(shù)

df.sort_values(by='',ascending=True/False)[:10]? df可以索引

df.value_counts()? -->按值計數(shù)

df.['a'] = df['b'].apply(lambda x:x>0)? -->DataFrame中的True/False

通過g.size()可以看到被groupby之后的數(shù)據(jù),得到的是一個Series

十六、排序

1、Series的排序:

? ? 1)對值進行排序

? ? Series.sort_values()? --->直接對Series的值進行排序

? ? 2)通過索引進行排序

? ? Series.sort_index()?

? ? #默認都是升序排列

2、DataFrame的排序

? ?? df.sort_values(by='')? -->按照某列的順序進行排序

? ? df['a'].sort_values()? -->返回對a列數(shù)據(jù)的排序結(jié)果,只返回a列

十七、DataFrame的rename

1、df.index = Series(['a','b','c'])? 直接對index賦予新值

2、df.index = df.index.map(str.upper)

? ?? map函數(shù)中只傳入新的函數(shù)名即可

3、df.rename(index=str.upper,columns=str.lower)

? ? ? 或者傳遞字典,進行一一轉(zhuǎn)換

十八、DataFrame的merge

? ? pd.merge(df1,df2,on=None,how='left/right/inner/outer')

? ? pd.merge(df1,df2)? -->沒有on參數(shù)默認先找相同的columns,然后在columns下找相同的values

? ? pd.merge(df1,df2,on='columns')? -->on參數(shù)是指按照指定列進行merge

? ? left:表示以左邊的數(shù)據(jù)表為基準(zhǔn),進行填充右面的數(shù)據(jù)

? ? right:表示以右邊的數(shù)據(jù)表為基準(zhǔn),填充左邊的數(shù)據(jù)

? ? outer:以on的指定列的所有值為基準(zhǔn),填充兩邊的數(shù)據(jù)

? ? inner:默認inner,相同on指定的columns下的相同values對應(yīng)的左右兩邊的數(shù)據(jù)

十九、concat和combine

1、concat拼接

? ? pd.concat([Series1,Series2])

? ? pd.concat([df1,df2])? -- >上下疊加,將沒有的列進行填充

2、combine組合

? ? Series1.combine_first(Series2)? -->用Series2的值去填充Series1中為空的值

? ? df1.combine_first(df2)? --->用df2將df1中的空值填充

二十、apply

? ? df['A'] = df['A'].apply(str.upper)? --->apply函數(shù)中也只輸入函數(shù)名

二十一、去重

? ? len(df)? -->求df的長度

? ? len(df['a'].unique())? -->查看a列中不重復(fù)數(shù)據(jù)的多少

? ? Series.duplicated()? -->返回一列True/False的Series

? ? Series.drop_duplicates()? -->刪除重復(fù)值

? ? df.drop_duplicates('a',keep='first/last')

? ? df.drop_duplicates()? -->刪除完全重復(fù)的行

? ? 參數(shù):'a'表示以a列為基準(zhǔn),刪除重復(fù)值

? ? ? ? ? ? ? first表示保留第一個,last表示保留最后一個

二十二、時間序列操作

? ? data_list = pd.date_range(start,end,period='D',freq)

? ? period='D',以天為單位

? ? freq = 'W' 以周為單位

? ? freq = 'W-Mon'以每周一位單位

? ? freq = '5H'? 以5h為單位

? ? 以data_range作為索引提取數(shù)據(jù)比較簡單

? ? df[datetime(2017,9,1)]

? ? df['2017-09-01']

? ? df['20170901']

? ? df['201709']

? ? 對時間序列數(shù)據(jù)進行分組聚合操作:

? ? s1.resample('M').mean()? -->以月為單位進行采樣,然后求每組的平均值

? ? s1.resample('H').ffill()? -->前項填充

? ? s1.resample('H').bfill()? -->后項填充

補充:1)jupyter中可以執(zhí)行l(wèi)inux命令,太棒了!

? ? ? ? ? ? ? ? !ls

? ? ? ? ? ? ? ? !more xxx.csv

? ? ? ? ? ? ? ? !pwd? 等等

? ? ? ? ?? 2)jupyter 查看函數(shù)幫助的快捷鍵:摁住shift + tab? 棒!!!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,958評論 2 373

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