pandas使用汇总--转载可以希望注明来源谢谢

1、pandas简洁
    高性能数据分析工具,帮助处理除了数值之外包括字符串,时间序列等在内的数据

2、pandas基本数据类型
    1、Series 一维,带标签数组
        1、创建series
            1、指定索引
                pd.Series(np.arange(10), index=list(string.ascii_uppercase[:10]))

                index=*** 指定索引,这里的是list类型的大写字母前10作为索引

            2、通过字典创建一个series,其中字典的键就是series的索引
                a = {}
                pd.Serirs(a)

        2、Series的切片和索引
            1、Series的索引
                1、数字索引
                    t = pd.Serirs(a)
                    t[1]  # 取第一个数据
                    t[[2, 3, 6, 9]]  # 取第2、3、6、9个数据
                    t[t>4]  # 取索引大于4的所有值

                2、键值索引
                    t['F']  # 取键值为F的值
                    t[['A', 'D', 'S']]  取键值为A、D、S的值

            2、Series的索引
                t[2:10:2]  # 从第3开始依次加2,不包括11

            3、取出索引和值
                t = pd.Serirs(a)
                t.index  # index属性取出键值
                t.value  # 取出所有的值values


    2、DataFrame 二维,Series容器
        1、pd.DataFrame(a, index=index, columns=columns)
            DataFrame对象既有行索引,又有列索引
            行索引,表明不同行,横向索引,叫index,0轴,axis=0
            列索引,表名不同列,纵向索引,叫columns,1轴,axis=1
            [ex]:
                a = np.arange(12).reshape((3, 4))
                index = ['张飞', '关羽', '刘备']
                columns = ['曹操', '于禁', '张颌', '徐晃']
                a = pd.DataFrame(a, index=index, columns=columns)

        2、基础属性
            DataFrame的基础属性
                df.shape # 行数列数
                df.dtypes # 列数据类型
                df.ndim # 数据维度
                df.index # 行索引
                df.columns # 列索引
                df.values # 对象值,二维ndarray数组

            DataFrame整体情况查询
                df.head(3) # 显示头部几行,默认5行
                df.tail(3) # 显示末尾几行,默认5行
                df.info() # 相关信息概览:行数,列数,列索引,列非空值个数,列类型,列类型,内存占用
                df.describe() # 咐速综合统计结果:计数,均值,标准差,最大值,四分位数,最小值

        3、排序方法
                df.sort_values(by="Count_AnimalName",ascending=False)

            对于 df 的dataframe数据结构按照Count_AnimalName索引进行排序

                df = df.sort_values(by="Count_AnimalName",ascending=False)
                a = df.head(10)
            按照这种方式取出 df 的按照Count_AnimalName索引排序后前10位的数据元素

        4、dataframe数据引用、索引和切片
            1、按照索引名Count_AnimalName排序后,取前100的数据
                df_sorted = df.sort_values(by="Count_AnimalName")
                df_sorted[:100]

            2、取某一列数据
                df["Count_AnimalName"]

            3、取前100行数据中Count_AnimalName列的数据
                df[:100]["Count_AnimalName"]

                [说明]:一般行没有名称,列有名称,如果有行名称的话可仿照取列数据的方式取用数据

        5、优化后的提取数据函数
            1、df.loc 通过标签索引行数据
                --df.loc['a', 'W']  # 取出 'a' 行,'W' 列的数据
                --df.loc['a', ['W','Y', 'Z']]  # 取出 'a'行,'W','Y', 'Z'列数据
                --df.loc['a', :]  # 取出 'a' 行数据
                --df.loc[:, ['W','Y', 'Z']]  # 取出 'W','Y', 'Z' 列数据

                --df.loc['a':'c', ['W','Y', 'Z']]  # 取出 'a'到'c' 行,'W','Y', 'Z' 列数据
                这里 'a'到'c' 行切片是闭合的,意思是取的到'c'行,和正常的切片不同

            2、df.iloc 通过位置获取行数据
                --df.iloc[1:3, [2, 3]]  # 取出1到3行中,2、3两列的数据
                --df.iloc[1:3, 4:7]  # 取出1到3行中,4到7列的数据

        6、pandas中nan不需要使用astype转化数据类型,因为函数自动会帮忙转化,在numpy中需要手动转化

        7、布尔索引
            df.[df['Count_AnimalName']>800]  # 选择df中'Count_AnimalName'索引下值大于800的值

            df.[(df['Count_AnimalName']>800)&(df['Row_labels'].str.len()<100)]

        8、pandas之字符串操作方法
            cat     实现元素級的字符串连接操作,可指定分隔符 
            contains    返回表示各字符串是否含有指定模式的布尔型数组
            count    模式的出现次数
            endswith, startswith    相当于对各个元素执行 x.endswith(pattern)和x.startswith(pattern)
            findall    计算各字符串的模式列表
            get    获取各元素的第i个字符
            join    根据指定的分隔符将Series中各元素的字符串连接起来
            len    计算各字符串的长度
            lower, upper    转换大小写,相当于对各个元素执行x.lower()或x.upper()
            match    根据指定的正则表达式对各个元素执行re.match
            pad    在字符串的左边、右边或左右两边添加空白符
            center    相当于 pad(side='both')
            repeat    重复值。例如,s.str.repeat⑶相当于对各个字符串执行X*3
            replace    用指定字符串替换找到的模式
            slice    对Series中的各个字符串进行子串截取
            split    根据分隔符或正则表达式对字符串进行拆分
            strip  rstrip  lstrip    去除空白符,包括换行符。相当于对各个元素执行x.strip()、x.rstrip()、x.lstrip()

        9、缺失数据处理
            1、numpy中处理nan: 先检查出nan,在替换为均值或者中值

            2、pandas中处理nan: (numpy中nan不能进行计算,pandas中可以进行计算)
                1、判断是否为nan
                    判断数据是否为NaN:pd.isnull(df),pd.notnull(df)

                2、处理nan数据
                    处理方式1:删除NaN所在的行列dropna(axis=0, how='any', inplace=False)
                        axis: 为0表示按照行  |  为1表示按照列
                        how参数:any表示只要有一个nan就删除(默认是any)  |  all表示全部为nan才进行删除
                        inplace参数:

                    处理方式2:填充数据,
                        t.fillna(t.mean())  --填充均值
                        t.fiallna(t.median())  --填充中值
                        t.fillna(0)  --填充一个数字:0

                    填充可以单独对某一列(或者是行)进行操作,因为不是每一列的nan都是数字,都可以填充,也不是每一列都可以求均值的
                    像电话号码、家庭住址等数据的缺失,nan不能使用均值等进行填充
                        t['age'] = t['age'].fillna(t['age'].mean())   # 对t数据的'age'列进行nan处理,填充进'age'这一列数据的均值

            3、对于数据中的0处理
                如果数据中的0非常确定是填充数据,补缺口使用的,可以是用
                    t[t==0] = np.nan   # 进行替换
                例如:家庭住址中有个0,电话号码有个0这样的可以换为nan  |  像点击数等不需要,因为不确定

                0和nan最大的区别就是:0参与运算,但是nan不参与运算

3、读取外部数据
    1、读取csv文件
        pd.read_csv('../numpy/csv/dogNames2.csv')

    2、读取mysql数据库文件
        pd.read_sql(sql_sentence,connection)

    3、读取mongodb数据库

4、pandas中常见统计数据
    1、如果希望输出结果不再折叠可以使用
        使用pd.set_option(pat, value)的模式可以设置各种样式

            pd.set_option('display.max_columns', 1000)   # 设置最大输出列为1000
            pd.set_option('display.max_rows', 500)   # 设置最大输出行为500

            pd.set_option('display.height', 1000)   # 设置输出窗口高度为1000
            pd.set_option('display.width', 1000)   # 设置输出窗口宽度为1000

        至于行数据不需要设置,因为输出太多本来就是符合实际要求,而列数据有利于我们观察数据类型,便于我们方便作出进一步分析因此有必要设置
        有的时候一行包含太多列,不能再一行中完全输出一列展示在console中,会使用\进行连接console中属于一列的两行数据 

    2、不重复统计
        1、set函数:相当于建立一个集合不允许重复,就是有重复也只算一个,很好地用于某些统计中
            len(set(df.['列名'].tolist()))
        2、df.unique():使用unique函数也可以达到set不重复统计的目的
            len(df.['列名'.unique()])

    3、把二维数组拉平成一维数组
        1、列表推导式
                num_acs = data['Actors'].str.split(', ').tolist()
                actors = [i for j in num_acs for i in j]
                print(len(set(actors)))
            这里是用列表推导式循环取出data中'Actors'这一列,切分字符串后形成的二维数组中的数据
            pandas中data['Actors']只是一个Series,而不是string所以不能直接调用split(),必须转换

        2、使用flatten函数
                必须先使用np.array(num_acs)转为numpy.ndarray(即使num_acs已经为list类型)

                【注意事项:但不是每次都能完全拉平和维度有关系】

5、数据的合并
    1、join函数
        A.join(B)   # 按照行进行合并

        合并时按照A的行作为依据,如果A的行大于B,B中缺失行填充NAN
                               如果A的行小于B,B中多余的行被截断不计入

    2、merge函数
        df1 和 df3两个data数据块,df1含有a、b、c、d四列,df3含有f、a、x三列  

        1、merge函数默认为inner,取交集
            df1.merge(df3, on='a')  
            取df1和df3中,按照某一列'a'进行拼接,且只拼接df1和df3有公共值的那一行    

        2、连接方式(和数据库中的连接很像)
            默认的合并方式inner,交集
            merge outer,并集,NaN补全
                df1.merge(df3, on='a', how='outer')   # 以两者为准,对于彼此都不具有的补充为NAN

            merge left,左边为准,NaN补全
                df1.merge(df3, on='a', how='left')   # 以左边为准,a这一列的df1有则都显示,df1没有则不显示

            merge right,右边为准,NaN补全
                df1.merge(df3, on='a', how='right')   # 以右边为准,a这一列的df3有则都显示,df3没有则不显示

        3、除了使用 表1.merge(表2, on='a', how='right')形式外
            pd.merge(表1, 表2, on=['表2待合并列名', '表2待合并列名'], how='合并方式')

6、分组和聚合
    1、使用grouped = df.groupby(by='索引名称'),返回对象是DataFrameGroupBy对象,是可迭代的
        grouped中的每一个元素是一个元组, 元组里面是(索引(分组的值),分组之后的DataFrame)
        1、按照一个索引进行分组
            group_by = data.groupby(by='Country')

        2、按照多个索引进行分组
                group_by = data['Brand'].groupby(by=[data['Country'], data['State/Province']]).count()
            如果是对一列数据(Series类型)进行分组,需要使用by=[data['Country'], data['State/Province']]这种写法,将分割条件单独分开

                df.groupby(by=["Country","State/Province"])["Country"].count()
            如果是对多列数据(DataFrame类型,而不是)进行分组,直接可以写by=["Country","State/Province"]
        
        3、对2中结果进行改进,让data['Brand']返回结果是DataFrame类型,而不是Series类型
                data['Brand']中[['Brand']]加上一个[]即可,相当于告诉ide我使用的是多个查询,但只传入一个条件,[['Brand']]位置可以放置在多个位置
                [ex]:
                    --group_by = data[['Brand']].groupby(by=[data['Country'], data['State/Province']]).count()

                    --group_by = data.groupby(by=[data['Country'], data['State/Province']])[['Brand']].count()

                    --group_by = data.groupby(by=[data['Country'], data['State/Province']]).count()[['Brand']]

    2、grouped(DataFrameGroupBy对象)能够调用的一般对象方法
        count        分组中非NA值的数量
        sum            非NA值的和
        mean        非NA值的平均值
        median        非NA值的算术中位数
        std, var    无偏(分母为n-1)标准差和方差
        min、max        非NA值的最小值和最大值

7、索引和复合索引
    1、简单的索引操作:
        --获取index:           df.index
        --指定index :          df.index = ['x','y']

        --重新设置index :       df.reindex(list("abcedf"))

        --指定某一列作为index : df.set_index("Country",drop=False)
            设置为:drop=False,表示将"Country"这一列设置为索引后不删除该列,默认是删除的(为True)

        --返回index的唯一值:    df.set_index("Country").index.unique()
            这个方法说明:设置一列作为索引后,会出现索引重复的情况,这里就是只取不重复索引的情况

        a为一个DataFrame,那么当a.set_index(["c","d"])即设置两个索引,即一个DataFrame结构中拿出两列作为索引是可以的

8、pandas时间序列
    1、时间序列生成
        pd.date_range(start=None, end=None, periods=None, freq='D')

            --start和end以及freq配合能够生成start和end范围内以频率freq的一组时间索引

            --start和periods以及freq配合能够生成从start开始的频率为freq的periods个时间索引

        [ex]:
            pd.date_range(start='20130112', end='20130212', freq='10D')
        每隔10天生成一次日期:DatetimeIndex(['2013-01-12', '2013-01-22', '2013-02-01', '2013-02-11'], dtype='datetime64[ns]', freq='10D'),这里10D不仅可以设置为D,还可以加上数字

            pd.date_range(start='20130112', periods=5,  freq='10D')
        每隔10天,起始日期为:20130112,一共生成5个

            按年对数据进行聚合,计算方式依然为求和。
        按年对数据进行聚合,计算方式依然为求和。

            loandata['loan_amnt'].resample('M',how=sum).fillna(0)
        将贷款金额字段按月聚合后求和,并用0填充空值。

            loandata[['loan_amnt','total_rec_int']].resample('M',how=[len,sum])
        分别对'loan_amnt'和'total_rec_int'按月聚合,并进行求和和计数计算

            loandata['2016-01':'2016-05'].resample('M',how=sum).fillna(0)
        对2016年1月至5月的数据按月进行了聚合,并计算求和。用0填充空值。

            loandata[loandata['loan_amnt']>5000].resample('M',how=sum).fillna(0)
        对于贷款金额大于5000的按月进行聚合,并计算求和。空值以0进行填充。

    2、日期形式
        W       星期
        
        D        Day                        每日历日
        B        BusinessDay                每工作曰
        H        Hour                    每小时
        T或min    Minute                    每分
        S        Second                    每秒
        L或ms    Milli                    每毫秒(即每千分之一秒)
        U        Micro                    每微秒(即每百万分之一秒)

        A       每年
        Q       按季度的最后一天切割,相当于每季度,可仿照下面有 BQ QS BQS等
        M        MonthEnd                每月最后一个日历曰,相当于每月
        BM        BusinessMonthEnd        每月最后一个工作日
        MS        MonthBegin                每月第一个日历日
        BMS        BusinessMonthBegin        每月第一个工作曰

    3、生成一个以日期为索引的dataframe
        index=pd.date_range("20170101",periods=10)
        df = pd.DataFrame(np.random.rand(10),index=index)

        1、生成一个索引从20170101开始,一共十个日期,以此为索引建立dataframe数据块

    4、使用函数将  含有日期的字符串  转换为  时间序列
        回到最开始的911数据的案例中,我们可以使用pandas提供的方法把时间字符串转化为时间序列:
            --df["timeStamp"] = pd.to_datetime(df["timeStamp"],format="")

            --format参数大部分情况下可以不用写,但是对于pandas无法格式化的时间字符串,我们可以使用该参数,比如包含中文

    5、重采样
        重采样:指的是将时间序列从一个频率转化为另一个频率进行处理的过程,

            --将高频率数据转化为低频率数据为降采样,

            --低频率转化为高频率为升采样

        pandas提供了一个resample的方法来帮助我们实现频率转化
            [ex]:
                count_by_month = data.resample("M").count()['title']
                resample中参数就是日期形式

        真的不行了或者很难找到原因,可以使用 dir(变量名) 的方式打开其所能够调用的所有方法和属性,通过分析可以试着进行处理变量

    6、rolling()函数及其系列
        1、DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)
            --window:表示时间窗的大小,注意有两种形式(int or offset)。如果使用int,则数值表示计算统计量的观测值的数量即向前几个数据。
                    如果是offset类型,表示时间窗的大小。pandas offset相关可以参考这里。

            --min_periods:最少需要有值的观测点的数量,对于int类型,默认与window相等。对于offset类型,默认为1。

            --freq:从0.18版本中已经被舍弃。

            --center:是否使用window的中间值作为label,默认为false。只能在window是int时使用。

            --win_type:窗口类型,默认为None一般不特殊指定,了解支持的其他窗口类型,参考这里。

            --on:对于DataFrame如果不使用index(索引)作为rolling的列,那么用on来指定使用哪列。

            --closed:定义区间的开闭,曾经支持int类型的window,新版本已经不支持了。对于offset类型默认是左开右闭的即默认为right。
                      可以根据情况指定为left both等。

            --axis:方向(轴),一般都是0。

        2、rolling_count 计算各个窗口中非NA观测值的数量
            pandas.rolling_count(arg, window, freq=None, center=False, how=None)
                --arg : DataFrame 或 numpy的ndarray 数组格式 
                --window : 指移动窗口的大小,为整数 
                --freq : 
                --center : 布尔型,默认为False, 指取中间的 
                --how : 字符串,默认为“mean”,为down- 或re-sampling

        3、rolling_sum 移动窗口的和
            pandas.rolling_sum(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)
                --arg : 为Series或DataFrame 
                --window : 窗口的大小 
                --min_periods : 最小的观察数值个数 
                --freq : 
                --center : 布尔型,默认为False, 指取中间的 
                --how : 取值的方式,默认为None

        4、以下为移动窗口系列汇总
            rolling_mean 移动窗口的均值
                pandas.rolling_mean(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)
        
            rolling_median 移动窗口的中位数
                pandas.rolling_median(arg, window, min_periods=None, freq=None, center=False, how='median', **kwargs)

            rolling_var 移动窗口的方差
                pandas.rolling_var(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)

            rolling_std 移动窗口的标准差
                pandas.rolling_std(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)

            rolling_min 移动窗口的最小值
                pandas.rolling_min(arg, window, min_periods=None, freq=None, center=False, how='min', **kwargs)

            rolling_max 移动窗口的最大值
                pandas.rolling_min(arg, window, min_periods=None, freq=None, center=False, how='min', **kwargs)

            rolling_corr 移动窗口的相关系数
                pandas.rolling_corr(arg1, arg2=None, window=None, min_periods=None, freq=None, center=False, pairwise=None, how=None)

            rolling_corr_pairwise 配对数据的相关系数,等价于: rolling_corr(…, pairwise=True)
                pandas.rolling_corr_pairwise(df1, df2=None, window=None, min_periods=None, freq=None, center=False)

            rolling_cov 移动窗口的协方差
                pandas.rolling_cov(arg1, arg2=None, window=None, min_periods=None, freq=None, center=False, pairwise=None, how=None, ddof=1)

            rolling_skew 移动窗口的偏度(三阶矩)
                pandas.rolling_skew(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)

            rolling_kurt 移动窗口的峰度(四阶矩)
                pandas.rolling_kurt(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)

            rolling_apply 对移动窗口应用普通数组函数
                pandas.rolling_apply(arg, window, func, min_periods=None, freq=None, center=False, args=(), kwargs={})

            rolling_quantile 移动窗口分位数函数
                pandas.rolling_quantile(arg, window, quantile, min_periods=None, freq=None, center=False)

            rolling_window 移动窗口
                pandas.rolling_window(arg, window=None, win_type=None, min_periods=None, freq=None, center=False, mean=True, axis=0, how=None, 
                **kwargs)

            ewma 指数加权移动
                ewma(arg[, com, span, halflife, ...])

            ewmstd 指数加权移动标准差
                ewmstd(arg[, com, span, halflife, ...])

            ewmvar 指数加权移动方差
                ewmvar(arg[, com, span, halflife, ...])

            ewmcorr 指数加权移动相关系数
                ewmcorr(arg1[, arg2, com, span, halflife, ...])

            ewmcov 指数加权移动协方差
                ewmcov(arg1[, arg2, com, span, halflife, ...])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值