您的位置:首页 > 编程语言 > Python开发

利用Python处理Excel数据

2017-10-29 20:25 369 查看

目录

读取数据

显示数据显示数据的行与列数

查看数据格式dtpyes

显示列名

添加默认的列名

显示数据后5行

显示数据唯一值

跳过文件的第i行不读取

对缺失值进行识别

数据清洗处理空值

更改数据格式

更改列名称

删除重复值

对列表内的值进行替换

数据预处理对数据进行排序

数据分组

数据分列

数据提取按标签提取

按位置提取

按标签和位置提取

按条件提取

从合并的数值中提取出指定的数值

数据筛选按条件筛选

数据汇总分类汇总

数据透视

数据统计数据采样

描述统计

协方差

相关性分析

读取数据

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
from pandas import Series, DataFrame
读取x.xlsx文件

EXCEL文件方法1.引入xlrd模块
import xlrd

读取数据
df = xlrd.open_workbook('x.xlsx')


方法2利用pandas模块
import  pandas as pd

读取数据
df = pd.read_excel('x.xlsx')
本文利用方法2

显示数据

显示数据的行与列数
df.shape
(24247, 17)
有24247行,17列数据

查看数据格式dtpyes
df.dtypes

数据格式
对文件进行描述

image.png显示列名
df.columns

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

添加默认列名
本数据有列名,所以不用添加

显示数据后5行
df.tail(5)

数据后5行
显示数据唯一值(unique函数)
df['经纪人级别'].unique()


经纪人级别级别为0 是因为对数据缺失值进行了填充
不读取哪里数据,可用skiprows=[i],跳过文件的第i行不读取
# 没有读取经纪人编号为20124403的行
df = pd.read_excel('x.xlsx',skiprows=[2] )
df.head()

不读取第二行
对缺失值进行识别
# 所有缺失值显示为True
# df.isnull()
pd.insull(df)

显示缺失值

数据清洗

处理空值
删除空值 (dropna函数)
df.dropna(how='any')

删除空值
删除空值 填充空值(fillna函数)
# 空值用0填充
df.fillna(value=0)


填充空值
用均值对空值进行填充
# 利用经纪人响应时长的均值对缺失值进行填充
df['经纪人响应时长'].fillna(df['经纪人响应时长'].mean())

填充均值 更改数据格式
通过dtypes函数显示大区的数据格式为int64,现在改成float格式
df['大区'].astype('float64')


float64更改列名称
df.rename(columns={'IM渠道': '渠道'})

更改列名称
删除重复值 (drop_duplicates()函数)
第一次出现的保留,其余删除
#使用默认第一次出现的被保留,后面出现的被删除
df['门店'].drop_duplicates()


第一次出现保留 最后一次出现的保留,其余删除
df['门店'].drop_duplicates(keep = 'last')

最后一次出现的保留对列表内的值进行替换(replace函数)
df['客户UCID'].replace('10531975', '110')

替换

数据预处理

对数据进行排序
df.sort_values(by=['客户当天发送消息数'])

排序
数据分组——excel中的数据透视表
** 对客户聊天记录进行分组
#如果price列的值>3000,group列显示high,否则显示low
df['group'] = np.where(df['客户当天发送消息数'] > 5,'high','low')
df


分组 对符合多个条件进行分组
# 符合经纪人级别为A1且经纪人响应时长>24的在sign列显示为1
df.loc[(df['经纪人级别'] == 'A1') & (df['经纪人响应时长']>= 24.0), 'sign']=1
df

符合多个条件数据分列
pd.DataFrame((x.split('网') for x in df['客户注册渠道']),
index=df.index,columns=['客户注册渠道','size'])

分列

数据提取

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

提取0-3行的数据
按日期进行提取
# 重新设置索引
df.reset_index()
#设置日期为索引
df=df.set_index('日期')
#提取2016年11月2号的数据
df[‘2016-11-2’ : '2016-11-02']

11月2号的数据

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

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


image.png按标签和位置提取 ix
# 行按日期排列,列按位置设置
df.ix['2016-11-03':'2016-11-03',4:6]


标签和位置按条件提取(loc与isin函数)
用isin函数进行判断
# 判断经纪人级别是否为A3
df['经纪人级别'].isin(['A3'])

判断先判断结果,将结果为True的提取
#先判断经纪人级别列里是否包含A3和M4,然后将复合条件的数据提取出来。
df.loc[df['经纪人级别'].isin(['A3','M4'])]

提取

从合并的数据中提出指定的数值
# 提取链家网三个字
data = df['客户注册渠道']
pd.DataFrame(data.str[:3])


提取指定数值

数据筛选

按条件筛选
符合多个条件,并显示指定条件(与)
#级别为M4,发送消息数大于110
df.loc[(df['经纪人当天发送消息数'] > 110) & (df['经纪人级别'] == 'M4'),
['经纪人响应时长','是否5分钟内响应','经纪人系统号']]

级别为M4,发送消息大于110
符合多个条件中的一个
#发送消息数大于400或响应时长大于60000
df.loc[(df['经纪人当天发送消息数'] > 400) | (df['经纪人响应时长'] > 60000.0),
['经纪人响应时长','经纪人系统号']].sort(['经纪人响应时长'])

#筛选完可直接求和
df.loc[(df['经纪人当天发送消息数'] > 400) | (df['经纪人响应时长'] > 60000.0),
['经纪人响应时长','经纪人系统号']].sort(['经纪人响应时长']).经纪人响应时长.sum()
686046.0不等于
df.loc[(df['经纪人当天发送消息数']!= 200) & (df['经纪人级别'] == 'A4'),
['经纪人响应时长','经纪人系统号']].sort(['经纪人响应时长'])

# count() 算总数
df.loc[(df['经纪人当天发送消息数']!= 200) & (df['经纪人级别'] == 'A4'), ['经纪人响应时长','经纪人系统号']].sort(['经纪人响应时长']).经纪人系统号.count()
927

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

A4或M4

数据汇总

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

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

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

数据不准确,因为进行了筛选填充
进行分组并进行算数运算
# 对经纪人响应时长进行分类汇总,并计算均值
df.groupby('经纪人级别')['经纪人响应时长'].agg([ np.mean])

分类,均值

数据透视
pd.pivot_table(df,index=["经纪人当天发送消息数"],values=["经纪人响应时长"],
columns=["经纪人级别"],aggfunc[len,np.sum],fill_value=0,margins=True)


数据透视

数据统计

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

随机抽取3行
设置采样权重
需要对每一行进行权重设置,列表行数少可行,过多不可行
假设有4行数据,设置采样权重
weights = [0, 0, 0.5, 0.5]
df.sample(n=4, weights=weights)

确定采样后是否放回
# 采样后放回,True
df.sample(n=6, replace=True)


描述统计 describe函数
自动生成数据的数量,均值,标准差等数据
#round(2),显示小数点后面2位数,T转置
df.describe().round(2).T

描述统计标准差std()
df['经纪人响应时长'].std()
5605.0826439555485

协方差cov
#计算两个字段之间的协方差
df['经纪人当天发送消息数'].cov(df['客户当天发送消息数'])
81.036975520713398

相关性分析corr
相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关
df['客户当天发送消息数'].corr(df['经纪人当天发送消息数'])
0.73482229334669258

作者:鬼宇书生
链接:http://www.jianshu.com/p/356a579062aa
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: