pandas常用函数汇总

作者: 肖月_1d28 | 来源:发表于2019-01-01 13:22 被阅读2次

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

    对常用函数做了汇总,每个函数的参数可能不是全的,但是常用的,不常用的没总结,如有问题,请不吝赐教,谢谢!

    一、Series

    1、创建Series

          通用函数:pd.Series(values,index)

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

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

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

            Series转字典:Series.to_dict()

         说明:Series的values参数是python中常见的一维数据类型。

    2、属性

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

               Series的values是array类型

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

               未指定index时,自动生成 0-(N-1)的整数索引,

               指定 index时,使用指定索引。

     3、Series的索引与切片

           Series[0] / Series['a']  : Sereis可以位置索引或标签索引,也可以进行切片操作

    二、DataFrame

    1、创建DataFrame

        1) 创建DataFrame的通用函数:

         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'])

    说明:创建方法与Sries类似,Series的values参数是python中常见的一维数据类型,DataFrame的values参数是python中常见的二维数据类型。

        2) 通过网页中复制数据快捷创建

            import webbrowser

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

            webbrowser.open(link)

            打开界面进行复制,将数据复制到粘贴板中

            df = pd.read_clipboard()   #从粘贴板中读取数据

        3)通过Series创建DataFrame

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

            注意:单独的s1,s2,s3是纵向排列的的Series,但是在DataFrame中是横向排列的。

            自己总结:Series除了打印出来是Series格式外,其他时候可以直接当作list来操作。

    2、属性

         1)df.columns

            通过columns生成新的DataFrame

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

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

        2)df.shape  显示行列数

        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))

          说明:类似于创建Series

     5、为某列对应的特定行重新赋值

            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的转置

          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行,所有列数据

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

          说明:iloc函数是位置索引,与索引的名字无关。

       2、loc

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

          说明:loc是标签索引,10,20,'movie_name'  都是索引名字,与位置无关。

    五、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之后删除行列的函数操作

          Series.drop('A')   #删除'A'所对应的值

          DataFrame.drop(label,axis) 

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

         ** 删除行还可以用 del df['A']

    七、NaN(not a number)

    nan是numpy的一种数据类型,np.nan,float类型

    任何数据与nan的运算结果都是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的个数达到阈值的个数时才删除该行或该列。

          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'对应的值

    2、多重索引格式转为二维DataFrame

        df = Series.unstack() -->转为二维DataFrame

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

    九、mapping和replace

    1、 map函数与apply函数、applymap函数的区别:

          1)map函数对Series中的每个元素作用;

          2)applymap函数对DataFrame中的每个元素作用;

          3)apply函数对对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表示对横轴进行操作,但是运算中表现为纵轴操作

        #axis=1表示对纵轴进行操作,但是运算中表现为横轴操作

    十一、分箱操作

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

     score_cat = pd.cut(Series,bins)  --->得到catgory类型的数据

     DataFrame的分箱技术很棒啊!

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

     -->新增一列,将a列的值按照labels进行分类标记,good!!!

     #生成长度为3的随机字符串  pd.util.testing.rands(3)

    十二、分组操作

    1、按照一列分组

          g = df.groupby('city')

          g是分组类型数据,打印不出来,所以看不到,但是有属性和方法可以间接的了解

         1) g.groups  -->得到分的几个组,和每个组包含的索引

         2)g.get_group('BJ')  -->得到'BJ'所对应的组

         3)groupby = split +apply +combine

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

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

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

               g.count()

               g.describe()

          4)g是一个可迭代对象,可以用list函数将其转化为list

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

              dict(list(g))  -->将其转化为字典

          同时可以通过for循环进行遍历操作: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)

    十三、数据聚合

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

     与g.agg('mean')方法一样

    十四、透视表

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

    index是分组的组名,values是透视表呈现结果的列,columns是values下的分解

    #感觉透视表呈现的结果就是groupby+agg后的结果

    #分析者需要对数据结构有一定的了解

    十五、其他函数

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

    df.value_counts()  -->按值计数

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

    通过g.size()可以看到被groupby之后的数据,得到的是一个Series

    十六、排序

    1、Series的排序:

        1)对值进行排序

        Series.sort_values()  --->直接对Series的值进行排序

        2)通过索引进行排序

        Series.sort_index() 

        #默认都是升序排列

    2、DataFrame的排序

         df.sort_values(by='')  -->按照某列的顺序进行排序

        df['a'].sort_values()  -->返回对a列数据的排序结果,只返回a列

    十七、DataFrame的rename

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

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

         map函数中只传入新的函数名即可

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

          或者传递字典,进行一一转换

    十八、DataFrame的merge

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

        pd.merge(df1,df2)  -->没有on参数默认先找相同的columns,然后在columns下找相同的values

        pd.merge(df1,df2,on='columns')  -->on参数是指按照指定列进行merge

        left:表示以左边的数据表为基准,进行填充右面的数据

        right:表示以右边的数据表为基准,填充左边的数据

        outer:以on的指定列的所有值为基准,填充两边的数据

        inner:默认inner,相同on指定的columns下的相同values对应的左右两边的数据

    十九、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函数中也只输入函数名

    二十一、去重

        len(df)  -->求df的长度

        len(df['a'].unique())  -->查看a列中不重复数据的多少

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

        Series.drop_duplicates()  -->删除重复值

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

        df.drop_duplicates()  -->删除完全重复的行

        参数:'a'表示以a列为基准,删除重复值

                  first表示保留第一个,last表示保留最后一个

    二十二、时间序列操作

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

        period='D',以天为单位

        freq = 'W' 以周为单位

        freq = 'W-Mon'以每周一位单位

        freq = '5H'  以5h为单位

        以data_range作为索引提取数据比较简单

        df[datetime(2017,9,1)]

        df['2017-09-01']

        df['20170901']

        df['201709']

        对时间序列数据进行分组聚合操作:

        s1.resample('M').mean()  -->以月为单位进行采样,然后求每组的平均值

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

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

    补充:1)jupyter中可以执行linux命令,太棒了!

                    !ls

                    !more xxx.csv

                    !pwd  等等

               2)jupyter 查看函数帮助的快捷键:摁住shift + tab  棒!!!

    相关文章

      网友评论

        本文标题:pandas常用函数汇总

        本文链接:https://www.haomeiwen.com/subject/dnrnlqtx.html