• python中的数据分析(juypter)


    加载数据后的套路

    df.head()
    df.info()
    df.describe()

    选择部分数据

    df[[要选中的列名的列表]]
    df.loc[,]
    df.iloc[,]
    df.query()

    增加

    df[新列名] = [新值]
    df.insert(loc , column,value =)

    删除

    df.drop()
    df.drop_duplicates()

    axis =0 可以改成1

    inplace

    修改数据

    df.iloc[0,0] = 10
    def func(x):
        return x
    s.apply(func) # 自定义处理,当修改的逻辑比较复杂的时候
    df.apply(func ,axis = )
    df.replace(to_replace = ,value=)

    修改表结构

    index

    df.set_index() # 把df中一列数据变成行索引
    df.reset_index() # 重置索引, 当前的索引会变成数据中的一列, 会添加一个从0开始计数的整数索引
    df.rename(index = {},columns={})
    df.columns = []
    df.index = []

    df.replace/df.rename 共同的特点, 老的值没找到, 不会报错, 正常执行, 不会改值

    df.insert 是修改数据的API中, 没有inplace 参数的一个 , 直接在原来数据上进行修改

    s.value_counts()

    s.unique()

    s.sort_values()

    1 常用排序和统计函数

    1 排序

    sort_values()

    # by 指定排序的字段  可以传入列表,做多字段排序, 比如下面的例子, 当价格相同的时候, 价格相同的数据再按面积排序
    # ascending 也可以传入列表,长度更by 的列表相同, 多字段排序的时候, 每个字段是升序还是降序排可以手动指定
    df.sort_values(by=['价格','面积'],ascending=False)

    nlargest()

    nsmallest()

    df.nlargest(5,columns=['价格'])  # 价格 n个最大的
    df.nsmallest(5,columns=['价格'])  # n个最小的

    2 统计函数

    df.corr() 计算相关性, 判断两列数据是否同增同减

    • 如果两列变量 一个增加, 另外一个也增加, 一个减少另外一个也减少, 说明他们之间具备正相关性 , 计算出来的相关系数>0 相关系数>0.7 强相关 0.3~0.7 之间 具有相关性 <0.3 相关性比较弱

    • 如果两列变量 一个增加, 另外一个减少, 一个减少另外一个增加, 说明他们之间具备负相关性

    相关性的应用场景

    • 用来判断不同数据之间是否有关联, 如果两列数据相关性比较强, 说明他们之间可能具有因果关系

    • 在数据分析过程中, 归因分析是比较重要的, 做归因可以从计算相关性开始进行分析

    • 相关不等于因果

    df.min() 最小 df.max() 最大 df.mean() 平均 df.std() 标准差 df.sum() 求和

    • 计算这些统计量的时候, 如果df中又多列数值型的数据, 既可以按行计算, 也可以按列计算, 通过传入0,1来进行控制

    2 缺失值处理

    2.1 认识缺失值, Pandas如何表示缺失值

    from numpy import NaN,NAN,nan
    

    Nan 是一个特殊的float类型的数据, 它和任何值都不相等

    2.2 加载数据后, 如何判断缺失值数量

    pd.read_csv('C:/Develop/顺义48/day01/02_代码/data/city_day.csv',keep_default_na=True,na_values='Ahmedabad')
    # keep_default_na 默认是True 数据中有空值会加载成NaN  如果改成False 空值就是空白内容  
    # na_values='Ahmedabad' 可以指定 哪些值可以作为缺失值处理
    

    如果没有特殊需求, 正常加载数据, 缺失会被加载成NAN

    df.isnull() # 是空值 返回True 不是返回False
    df.notnull()  # 不是空值 返回True 是返回False
    

    计算每一列缺失值的数量

    df.isnull().sum()
    

    2.3 缺失值的处理

    删除缺失值
    • 使用dropna函数来删除空值,具体用法如下

      # 函数用法
      df.dropna(    
          axis=0,     
          how='any',     
          inplace=True,     
          subset=['列名',...],    
          thresh=10
      )
      
      df.drop() # 按列删除
      
    • dropna函数参数解释

      • axis=0

        • 可选参数 ,默认为0按行删

        • 0, or 'index':删除包含缺失值的行

        • 1, or 'columns':删除包含缺失值的列

      • how='any'

        • 可选参数,默认为any

        • any: 如果存在NA值,则删除该行或列

        • all: 如果所有值都是NA,则删除该行或列

      • inplace=False

        • 可选参数,不建议使用这个参数

        • 默认False, 不对原数据集进行修改

        • inplce=True,对原数据集进行修改

      • subset接收一个列表

        • 接收一个列表,列表中的元素为列名: 对特定的列进行缺失值删除处理

      • thresh=n

        • 可选参数

        • 参数值为int类型,按行去除NaN值,去除NaN值后该行剩余数值的数量(列数)大于等于n,便保留这一行

    缺失值填充

    非时序数据

    • 考虑用默认值填充

    • 使用统计量进行填充 均值, 中位数,众数

    pm25_mean = df2['PM2.5'].mean()
    df2['PM2.5'].fillna(pm25_mean)
    

    时序数据

    • 天气数据,股票的数据

    • 跟时间相关, 前一个数据和后一个数据有一定关系

    时序数据填充可以考虑用前一个非空值, 后一个非空值填充,可以使用线性插值

    s1 = df['Xylene'][54:64]
    
    s1.fillna(method='ffill')
    
    s1.fillna(method='bfill')
    
    s1.interpolate()
    

    3 数据类型转换

    3.1 数值型和字符串之间的转换

    astype()

    pd.to_numeric()

    import pandas as pd
    df = pd.read_csv('C:/Develop/顺义48/day01/02_代码/data/city_day.csv')
    df['PM2.5'] = df['PM2.5'].astype(object)
    
    df2 = df.head().copy()
    # 创造包含'missing'为缺失值的数据,批量替换第1、3、5行中NO列的值为字符串'missing'
    df2.loc[::2, 'NO'] = 'missing'
    df2.info()
    df2['NO'].astype(float)
    

    ValueError: could not convert string to float: 'missing'

    如果一列数据中, 有数值类型,也有字符串, astype转换为数值会报错,此时可以使用to_numeric()方法, 可以把字符串转换成空值

    pd.to_numeric(df2['NO'],errors='coerce')
    

    3.2 日期时间类型

    datetime64 [ns]

    • 日期事件类型的列, 加载之后, 可以转换成日期事件类型, 就是datetime64[ns]

    pd.to_datetime()
    
    • 也可以在加载的时候直接指定日期列, 直接加载成日期时间类型

    pd.read_csv('',parse_dates = [日期列名])
    

    Timestamp 时间戳

    • pd.to_datetime('时间点')

    timedelta64 时间差值

    两个时间相减

    使用的时候需要注意, 如果一列数据 Series 是datetime64 、 timedelta64 的时候, 获取时间维度的相关属性需要通过

    s.dt.XXX 来获取

    print(df['Date'].dt.year) # 获取年
    print(df['Date'].dt.month) # 月
    print(df['Date'].dt.day) # 日
    df['Date'].dt.quarter # 季度
    
    s_time_delta = df['Date']-df['Date'].min()
    s_time_delta.dt.days
    

    datetime类型和timedelta类型都可以作为索引

    • 好处, 方便按照时间维度筛选数据

    • 方便按照时间维度进行切片操作

    # Data 是日期时间类型列,  set_index 设置成行索引
    df.set_index('Date', inplace=True)
    # 在切片、按时间维度筛选数据之前, 先对日期时间索引排序
    df = df.sort_index() # 对索引进行排序
    df.loc['2018']
    df.loc['2018-01-01']
    df.loc['2018-02-01 22':'2018-02-02 23:59:59']
    

    DatetimeIndex 类型 日期时间索引

    计算两列日期数据的差值, 得到timedelta类型的Series可以把它设置为index 索引, 得到的是 TimedeltaIndex

    df2 = df.query('City == "Delhi"')
    df2.index = df2['Date']-df2['Date'].min()
    df2.index
    df2['3 days':'4 days']
    

    4 分组聚合

    df.grouppy([分组字段], as_index= )['聚合字段'].聚合方法()

    df.grouppy([分组字段], as_index= )['聚合字段'].agg(['聚合方法名'])

    df.grouppy([分组字段], as_index= ).agg({‘聚合字段名’:'聚合方法名','聚合字段名’:'聚合方法名'})

    • 分组字段,可以有1个多个, 默认分组的字段在分组的结果中会作为行索引, 如果设置了as_index = False ,分组字段会作为结果的列数据, 会使用从0开始的整数索引

    • 聚合字段可以有1个多个, 可以通过agg来指定不同的字段, 使用不同的聚合方式

    • 多个字段分组, 多个字段聚合, 得到的结果 MultiIndex 通过MultiIndex 做数据筛选, 传入的是元组

    import pandas as pd
    df = pd.read_csv('C:/Develop/顺义48/day01/02_代码/data/LJdata.csv')
    #%%
    df.groupby(['区域']).mean()
    # FutureWarning 未来版本变化的提示, python 包版本升级之后, 可能一些方法, 或参数直接就变了, 或者删掉了
    # 看到提示之后, 需要注意, 当前这份代码, pandas的版本不要升级
    # python项目开发好之后, 开发时候用到的软件包, 不要升级
    
    
    print(df.groupby('区域')['价格'].mean())
    print(df.groupby('区域')[['价格']].mean())
    df.groupby('区域')[['价格','面积']].mean()
    print(df.groupby('区域')[['价格','面积']].agg(['mean','max']))
    df_result= df.groupby('区域')[['价格','面积']].agg(['mean','max'])
    df_result.columns
    # MultiIndex([('价格', 'mean'),
    #             ('价格',  'max'),
    #             ('面积', 'mean'),
    #             ('面积',  'max')],
    #            )
    
    print(df_result[[('价格', 'mean'),('价格',  'max')]])
    
    df.groupby('区域').agg({'价格':'mean','面积':'max'})
    
    df_result2 = df.groupby(['区域','户型']).agg({'价格':'mean','面积':'max'})
    
    df_result2.index # 查看索引 当前对两个字段进行分组, 得到的是MultiIndex
    
    df_result2.reset_index() # 重置索引
    
    df.groupby(['区域','户型'],as_index=False).agg({'价格':'mean','面积':'max'})
    

    DataFrameGroupby对象 (了解)

    df.groupby('区域')['价格'].mean()

    • df.groupby('区域') → 对象 DataFrameGroupby

    • df_gb = df.groupby('区域')
      df_gb.groups # 可以获取所有的分组 {'区域取值':[当前取值在数据中的行索引]}
      df_gb.get_group('区域取值') → 这一组对应的DataFrame数据
      
    • df.groupby('区域')['价格'] → 对象 SeriesGroupby

    自定义聚合函数

    • df.groupby('分组字段')['聚合字段'].agg(自定义聚合函数对象)

    ## 自定义聚合函数
    def my_mean(x):
        print(x)
        print('=====')
        return x.sum()/len(x)
    df.groupby('区域')['价格'].agg(my_mean)
    

    5 数据分组(分箱) pd.cut

    使用场景:

    • 把年龄划分成少年, 青年, 中年, 老年

    • 收入划分成, 低收入, 中收入, 高收入 。。

    • 价格 便宜, 中等, 贵

    # 等距 每一组 边界差距, 尽量均匀
    pd.cut(df['价格'],bins = 3) # bins 传入要分几组
    # 可以自定义分组的边界
    pd.cut(df['价格'],bins = [0,3000,8500,210000],labels=['便宜','中等','贵'])
    # bins 默认区间是左开右闭合 (0,3000]  (3000,8500], (8500,210000] 需要注意最小的区间要比数据中的最小值小一些
    # labels 可以指定分组之后, 每一组的名字,如果不指定默认使用的就是分组的边界的取值
    
  • 相关阅读:
    小白入门pytorch(一)
    C#中ThreadPool线程池的使用总结
    路由器端口转发
    【主流技术】日常工作中关于 JSON 转换的经验大全(Java)
    activiti 通过xml上传 直接部署模型
    【python笔记】客户运营 - cohort分析
    等级保护测评备案业务中十个常见问题解答
    Java EE——JVM基础知识
    【精选】代码Ai生成,
    Linux基本指令(下)
  • 原文地址:https://blog.csdn.net/m0_62008384/article/details/139635156