利用Python处理Excel数据

https://blog.csdn.net/liuyq859/article/details/78387600

  • 读取数据
  • 显示数据
    • 显示数据的行与列数
    • 查看数据格式dtpyes
    • 显示列名
    • 添加默认的列名
    • 显示数据后5行
    • 显示数据唯一值
    • 跳过文件的第i行不读取
    • 对缺失值进行识别
  • 数据清洗
    • 处理空值
    • 更改数据格式
    • 更改列名称
    • 删除重复值
    • 对列表内的值进行替换
  • 数据预处理
    • 对数据进行排序
    • 数据分组
    • 数据分列
  • 数据提取
    • 按标签提取
    • 按位置提取
    • 按标签和位置提取
    • 按条件提取
    • 从合并的数值中提取出指定的数值
  • 数据筛选
    • 按条件筛选
  • 数据汇总
    • 分类汇总
    • 数据透视
  • 数据统计
    • 数据采样
    • 描述统计
    • 协方差
    • 相关性分析

读取数据

 
  1. import pandas as pd

  2. import numpy as np

  3. import matplotlib.pyplot as plt

  4. from datetime import datetime

  5. from pandas import Series, DataFrame

读取x.xlsx文件

EXCEL文件

  • 方法1.
    1. 引入xlrd模块
      import xlrd
    2. 读取数据
      df = xlrd.open_workbook('x.xlsx')
  • 方法2
    1. 利用pandas模块
      import  pandas as pd
    2. 读取数据
      df = pd.read_excel('x.xlsx')
      本文利用方法2

显示数据

  • 显示数据的行与列数

    df.shape

    (24247, 17)
    有24247行,17列数据

  • 查看数据格式dtpyes

    df.dtypes

    数据格式

  • 对文件进行描述

image.png

  • 显示列名
    df.columns

    列名

  • 如果数据没有标题行,可用pandas添加默认的列名
     
    1. df = pd.read_excel('x.xlsx', header = None)

    2. #显示前数据前5行

    3. df.head(5)

    添加默认列名

    本数据有列名,所以不用添加
  • 显示数据后5行

    df.tail(5)

    数据后5行

  • 显示数据唯一值(unique函数)

    df['经纪人级别'].unique()

经纪人级别

级别为0 是因为对数据缺失值进行了填充

  • 不读取哪里数据,可用skiprows=[i],跳过文件的第i行不读取

     
    1. # 没有读取经纪人编号为20124403的行

    2. df = pd.read_excel('x.xlsx',skiprows=[2] )

    3. df.head()

    不读取第二行

  • 对缺失值进行识别

     
    1. # 所有缺失值显示为True

    2. # df.isnull()

    3. pd.insull(df)

    显示缺失值

数据清洗

  • 处理空值
    删除空值 (dropna函数)

    df.dropna(how='any')

    删除空值

    删除空值

    填充空值(fillna函数)

     
    1. # 空值用0填充

    2. df.fillna(value=0)

填充空值


用均值对空值进行填充

 
  1. # 利用经纪人响应时长的均值对缺失值进行填充

  2. df['经纪人响应时长'].fillna(df['经纪人响应时长'].mean())

填充均值

  • 更改数据格式

    通过dtypes函数显示大区的数据格式为int64,现在改成float格式

    df['大区'].astype('float64')

float64

  • 更改列名称

    df.rename(columns={'IM渠道': '渠道'})

    更改列名称

  • 删除重复值 (drop_duplicates()函数)
    第一次出现的保留,其余删除

     
    1. #使用默认第一次出现的被保留,后面出现的被删除

    2. df['门店'].drop_duplicates()

第一次出现保留

最后一次出现的保留,其余删除

df['门店'].drop_duplicates(keep = 'last')

最后一次出现的保留

  • 对列表内的值进行替换(replace函数)
    df['客户UCID'].replace('10531975', '110')

    替换

数据预处理

  • 对数据进行排序

    df.sort_values(by=['客户当天发送消息数'])

    排序

  • 数据分组——excel中的数据透视表
    ** 对客户聊天记录进行分组

     
    1. #如果price列的值>3000,group列显示high,否则显示low

    2. df['group'] = np.where(df['客户当天发送消息数'] > 5,'high','low')

    3. df

分组

对符合多个条件进行分组

 
  1. # 符合经纪人级别为A1且经纪人响应时长>24的在sign列显示为1

  2. df.loc[(df['经纪人级别'] == 'A1') & (df['经纪人响应时长']>= 24.0), 'sign']=1

  3. df

符合多个条件

  • 数据分列
     
    1. pd.DataFrame((x.split('网') for x in df['客户注册渠道']),

    2. index=df.index,columns=['客户注册渠道','size'])

    分列

数据提取

  • 按标签提取
    • loc函数
      df.loc[0:3]

      提取0-3行的数据

    • 按日期进行提取
       
      1. # 重新设置索引

      2. df.reset_index()

      3. #设置日期为索引

      4. df=df.set_index('日期')

      5. #提取2016年11月2号的数据

      6. df[‘2016-11-2’ : '2016-11-02']

      11月2号的数据

  • 按位置进行提取(iloc函数)
    • 按区域提取
      df.iloc[:4, :5]

      4行5列

    • 按位置提取
       
      1. #[0, 2, 5] 代表指定的行,[ 4, 5 ] 代表指定的列

      2. df.iloc[[0,2,5],[4,5]]

image.png

  • 按标签和位置提取 ix
     
    1. # 行按日期排列,列按位置设置

    2. df.ix['2016-11-03':'2016-11-03',4:6]

标签和位置

  • 按条件提取(loc与isin函数)

    • 用isin函数进行判断
       
      1. # 判断经纪人级别是否为A3

      2. df['经纪人级别'].isin(['A3'])

      判断

      • 先判断结果,将结果为True的提取
         
        1. #先判断经纪人级别列里是否包含A3和M4,然后将复合条件的数据提取出来。

        2. df.loc[df['经纪人级别'].isin(['A3','M4'])]

        提取

  • 从合并的数据中提出指定的数值

     
    1. # 提取链家网三个字

    2. data = df['客户注册渠道']

    3. pd.DataFrame(data.str[:3])

提取指定数值

数据筛选

  • 按条件筛选

    • 符合多个条件,并显示指定条件(与)
       
      1. #级别为M4,发送消息数大于110

      2. df.loc[(df['经纪人当天发送消息数'] > 110) & (df['经纪人级别'] == 'M4'),

      3. ['经纪人响应时长','是否5分钟内响应','经纪人系统号']]

      级别为M4,发送消息大于110

    • 符合多个条件中的一个
       
      1. #发送消息数大于400或响应时长大于60000

      2. df.loc[(df['经纪人当天发送消息数'] > 400) | (df['经纪人响应时长'] > 60000.0),

      3. ['经纪人响应时长','经纪人系统号']].sort(['经纪人响应时长'])

       
      1. #筛选完可直接求和

      2. df.loc[(df['经纪人当天发送消息数'] > 400) | (df['经纪人响应时长'] > 60000.0),

      3. ['经纪人响应时长','经纪人系统号']].sort(['经纪人响应时长']).经纪人响应时长.sum()

      686046.0
      • 不等于
         
        1. df.loc[(df['经纪人当天发送消息数']!= 200) & (df['经纪人级别'] == 'A4'),

        2. ['经纪人响应时长','经纪人系统号']].sort(['经纪人响应时长'])

         
        1. # count() 算总数

        2. df.loc[(df['经纪人当天发送消息数']!= 200) & (df['经纪人级别'] == 'A4'),

        3. ['经纪人响应时长','经纪人系统号']].sort(['经纪人响应时长']).经纪人系统号.count()

        927
  • 使用query函数

    df.query('经纪人级别 == ["A4", "M4"]')

    A4或M4

数据汇总

  • 分类汇总groupby
    • 对所有列进行分类汇总
      df.groupby('经纪人级别').count()

      经纪人级别

    • 对特定列进行汇总
      df.groupby('经纪人级别')['经纪人响应时长'].count()

      对响应时长列进行汇总

    • 增加分类条件
      df.groupby(['经纪人级别','经纪人是否回复'])['经纪人响应时长'].count()

      数据不准确,因为进行了筛选填充

    • 进行分组并进行算数运算
       
      1. # 对经纪人响应时长进行分类汇总,并计算均值

      2. df.groupby('经纪人级别')['经纪人响应时长'].agg([ np.mean])

      分类,均值

  • 数据透视
     
    1. pd.pivot_table(df,index=["经纪人当天发送消息数"],values=["经纪人响应时长"],

    2. columns=["经纪人级别"],aggfunc[len,np.sum],fill_value=0,margins=True)

    数据透视

数据统计

  • 数据采样
    • 简单随机抽取sample
      df.sample(n=3)

      随机抽取3行

    • 设置采样权重
      需要对每一行进行权重设置,列表行数少可行,过多不可行
      假设有4行数据,设置采样权重
       
      1. weights = [0, 0, 0.5, 0.5]

      2. df.sample(n=4, weights=weights)

    • 确定采样后是否放回
       
      1. # 采样后放回,True

      2. df.sample(n=6, replace=True)

  • 描述统计 describe函数
    自动生成数据的数量,均值,标准差等数据

     
    1. #round(2),显示小数点后面2位数,T转置

    2. df.describe().round(2).T

    描述统计

    • 标准差std()
      df['经纪人响应时长'].std()
      5605.0826439555485
  • 协方差cov

     
    1. #计算两个字段之间的协方差

    2. df['经纪人当天发送消息数'].cov(df['客户当天发送消息数'])

    81.036975520713398

  • 相关性分析corr
    相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关

    df['客户当天发送消息数'].corr(df['经纪人当天发送消息数'])

    0.73482229334669258



作者:鬼宇书生
链接:http://www.jianshu.com/p/356a579062aa
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

猜你喜欢

转载自blog.csdn.net/baidu_32542573/article/details/86310575