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? 棒!!!