再次感慨数据预处理的重要性...............
每次都是因为一个小小的问题,花了太多的时间,希望每次遇到新的问题都记录一下方便查阅。
工具:jupyter 环境:python3
一、读取常见数据直接调用pandas模块,如txt、csv、excel等等。
%%time
import pandas as pd
df = pd.read_excel('demo.xlsx',sheet_name=None)
%%time可显示读取该表格所用时间及CPU使用时间。read_excel()里面有很多可配置的参数,如下:
pd.read_excel(io, sheetname=0,header=0,skiprows=None,index_col=None,names=None,
arse_cols=None,date_parser=None,na_values=None,thousands=None,
convert_float=True,has_index_names=None,converters=None,dtype=None,
true_values=None,false_values=None,engine=None,squeeze=False,**kwds)
io :excel 路径;
sheetname:默认是sheetname为0,返回多表使用sheetname=[0,1],若sheetname=None是返回全表 。注意:int/string返回的是dataframe,而none和list返回的是dict of dataframe。
header :指定作为列名的行,默认0,即取第一行,数据为列名行以下的数据;若数据不含列名,则设定 header = None;
skiprows:省略指定行数的数据
skip_footer:省略从尾部数的行数据
index_col :指定列为索引列,也可以使用 u’string’
names:指定列的名字,传入一个list数据
输出如下:
CPU times: user 8min 33s, sys: 28.4 s, total: 9min 1s
Wall time: 9min 1s
二、获取excel表中所有表的表名
有时候一张excel表中包含好多张sheet表,当无法直观的查看到时,可使用如下操作:
# 获取表格数量
import openpyxl
wb = openpyxl.load_workbook('2018-03.xlsx')
# 获取workbook中所有的表格
sheets = wb.sheetnames
print(sheets)
输出:
['1-10', '11-20', '21-31']
表示这张excel表里面包含1-10,11-20,21-31这三张sheet表。
三、更改列名
直接暴力强转,当然还有其他许多办法,不过我就为了简洁来的快。
先输出看一下一个sheet表里表名:
print(df['1-10'].columns)
输出:
Index(['Column1', 'Column2', 'Column5', 'Column11', 'Column12', 'Column48'], dtype='object')
直接更改:
df['0-10'].columns=['Seq','User_Id','Agent_station','Start_dt','Recording_Secs','CalledPartyNumber']
四、head()、info()、describe()数据查看
观察一下数据读取是否准确,可以使用head()函数,如果里面不加参数,默认输出前5行。
查看索引、数据类型和内存信息可使用info()函数。
查看数值型列的汇总统计可使用describe()函数,会输出min、max、mean、std等等。
常用的这几个,还有tail()输出数据后5行,shape()查看行数和列数,以及apply(pd.Series.value_counts)查看DataFrame对象中每一列的唯一值和计数。
五、pd.str.slice()函数 ,按给点的开始结束位置切割字符串
遇到一些数据项中不想要的数据,可用slice进行切割,比如数据项里的数据为 018192447273 ,但我只想要18192447273,就可以用slice切割:
原始数据
输出:
切分后数据
六、数据拼接pd.merge()函数
DataFrame.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
left: 拼接的左侧DataFrame对象
right: 拼接的右侧DataFrame对象
on: 要加入的列或索引级别名称。 必须在左侧和右侧DataFrame对象中找到。 如果未传递且left_index和right_index为False,则DataFrame中的列的交集将被推断为连接键。
left_on:左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
right_on: 左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
left_index: 如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。 对于具有MultiIndex(分层)的DataFrame,级别数必须与右侧DataFrame中的连接键数相匹配。
right_index: 与left_index功能相似。
how: One of ‘left’, ‘right’, ‘outer’, ‘inner’. 默认inner。inner是取交集,outer取并集。比如left:[‘A’,‘B’,‘C’];right[’'A,‘C’,‘D’];inner取交集的话,left中出现的A会和right中出现的买一个A进行匹配拼接,如果没有是B,在right中没有匹配到,则会丢失。'outer’取并集,出现的A会进行一一匹配,没有同时出现的会将缺失的部分添加缺失值。
sort: 按字典顺序通过连接键对结果DataFrame进行排序。 默认为True,设置为False将在很多情况下显着提高性能。
suffixes: 用于重叠列的字符串后缀元组。 默认为(‘x’,’ y’)。
copy: 始终从传递的DataFrame对象复制数据(默认为True),即使不需要重建索引也是如此。
indicator:将一列添加到名为_merge的输出DataFrame,其中包含有关每行源的信息。 _merge是分类类型,并且对于其合并键仅出现在“左”DataFrame中的观察值,取得值为left_only,对于其合并键仅出现在“右”DataFrame中的观察值为right_only,并且如果在两者中都找到观察点的合并键,则为left_only。
用以筛选出两个dataframe中的相同的元素,非常好用,还快。
七、去重:pd.drop_duplicates()函数
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)
subset : column label or sequence of labels, optional
用来指定特定的列,默认所有列
keep : {‘first’, ‘last’, False}, default ‘first’
删除重复项并保留第一次出现的项
inplace : boolean, default False
是直接在原来数据上修改还是保留一个副本