精华内容
下载资源
问答
  • 利用Python实现数据匹配(vlookup)
    千次阅读
    2020-12-08 04:48:43

    平时我们经常会制作周报、月报这种Excel操作相同的报表,我们可以使用python的pandas库对其进行自动化。这篇文章就演示了利用python实现使用Excel中的vlookup函数,并将其脚本封装成exe可执行程序。

    写这段脚本的原因是因为我们部门的一个做渠道的同事不太会用vlookup函数,所以我琢磨着将他要用到vlookup的工作需求写成脚本供他使用。

    需求:要将B表中的“收入”字段的数据匹配到A表中去:

    表A:

    表A

    表B

    表B

    结果:

    结果

    脚本内容如下:

    import pandas as pd

    table_a_name = input("请输入A表文件名:")

    table_a_path = table_a_name + '.xlsx'

    sheet_a_name = input("请输入A表中的sheet名称:")

    table_a = pd.read_excel(table_a_path,sheet_name = sheet_a_name,converters={'订单号':str}).dropna(axis=1,how='all')

    table_b_name = input("请输入B表文件名:")

    table_b_path = table_b_name + ".xlsx"

    sheet_b_name = input("请输入B表中的sheet名称:")

    table_b = pd.read_excel(table_b_path,sheet_name=sheet_b_name,converters={'交易ID':str})

    table_b_2 = table_b.groupby("交易ID").收入.sum().reset_index()

    table_c = table_a.merge(right=table_b_2,how='left',left_on='订单号',right_on='交易ID')

    table_c.to_excel('c.xlsx',index=False)

    考虑到同事不会使用python,故将这段脚本封装成可执行exe文件,关于怎样将Python代码封装打包成可执行的exe文件以及可能碰见的报错解决详见我之前的文章:将python脚本打包封装成exe程序

    过程演示.gif

    但是上面的exe使用起来并不够直观、方便,故又利用tkinter制作了一个GUI界面:

    GUI界面.gif

    制作GUI界面的脚本如下:

    #!/usr/bin/python

    # -*- coding:utf-8 -*-

    from tkinter import *

    import pandas as pd

    import os

    import re

    window = Tk()

    window.title('数据匹配')

    window.geometry('300x400')

    var1 = StringVar()

    var2 = StringVar()

    var3 = StringVar()

    var4 = StringVar()

    var5 = StringVar()

    var6 = StringVar()

    var7 = StringVar()

    L1 = Label( text="请输入表A的名称:")

    L1.pack()

    e1 = Entry(window,show=None,textvariable=var1)

    e1.pack()

    L2 = Label( text="请输入表A中sheet名称:")

    L2.pack()

    e2 = Entry(window,show=None,textvariable=var2)

    e2.pack()

    L3 = Label( text="请输入表A中的ID列:")

    L3.pack()

    e3 = Entry(window,show=None,textvariable=var3)

    e3.pack()

    L4 = Label( text="请输入表B的名称:")

    L4.pack()

    e4 = Entry(window,show=None,textvariable=var4)

    e4.pack()

    L5 = Label( text="请输入表B中sheet名称:")

    L5.pack()

    e5 = Entry(window,show=None,textvariable=var5)

    e5.pack()

    L6 = Label( text="请输入表B中的ID列:")

    L6.pack()

    e6 = Entry(window,show=None,textvariable=var6)

    e6.pack()

    L7 = Label( text="请输入要匹配的表B中的列名:")

    L7.pack()

    e7 = Entry(window,show=None,textvariable=var7)

    e7.pack()

    def data_match():

    path = 'C:\\Users\\PS20190225\\Desktop'

    os.chdir(path)

    table_a_path = e1.get()

    a_type = re.search(r'([a-z]*).([a-z]*)',table_a_path).group(2)

    sheet_a_name = e2.get()

    A_id = e3.get()

    if a_type == 'xlsx':

    table_a = pd.read_excel(table_a_path,sheet_name = sheet_a_name,converters={A_id:str}).dropna(axis=1,how='all')

    else:

    table_a = pd.read_csv(table_a_path, sheet_name=sheet_a_name, converters={A_id: str}).dropna(axis=1, how='all')

    table_b_path = e4.get()

    b_type = re.search(r'([a-z]*).([a-z]*)',table_b_path).group(2)

    sheet_b_name = e5.get()

    B_id = e6.get()

    target_col = e7.get()

    if b_type == 'xlsx':

    table_b = pd.read_excel(table_b_path, sheet_name=sheet_b_name, converters={B_id: str}).dropna(axis=1, how='all')

    else:

    table_b = pd.read_csv(table_b_path, sheet_name=sheet_b_name, converters={B_id: str}).dropna(axis=1, how='all')

    table_b_2 = table_b.groupby(B_id)[target_col].sum().reset_index()

    table_c = table_a.merge(right=table_b_2,how='left',left_on=A_id,right_on=B_id)

    table_c.to_excel('c.xlsx',index=False)

    b = Button(window,text='进行匹配',width=15,height=2,command=data_match)

    b.pack()

    window.mainloop()

    学习tkinter可观看莫凡大佬的视频:做简单窗口视窗

    更多相关内容
  • 主要介绍了利用Python实现Excel的文件间的数据匹配,本文通过一个函数实现此功能,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • 主要给大家介绍了关于利用python如何处理百万条数据的相关资料,本文的教程非常适用于java新手,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
  • 第一章 准备工作 1.1 本书内容 虽然书名带有“数据分析”,但是本书着重于Python... 该库提供了高级数据结构和函数,使得利用结构化、表格化数据的工作快速、简单、有表现力。 1.3.3 matplotlib 该库是最流行...

    第一章 准备工作

    1.1 本书内容
    虽然书名带有“数据分析”,但是本书着重于Python语言的编程、类库、工具而不是数据分析方法论。

    1.3 重要的Python库

    1.3.1 Numpy
    该库是Python数值计算的基石。
    1.3.2 pandas
    该库提供了高级数据结构和函数,使得利用结构化、表格化数据的工作快速、简单、有表现力。
    1.3.3 matplotlib
    该库是最流行的用于制图及其他二维数据可视化的Python库。
    1.3.4 IPython与Jupyter
    关系:IPython自身已经是Jupyter开源项目中的一个组件,后者提供交互性、探索性的高效环境。
    1.3.6 scikit-learn的模块
    分类:SVM、最近邻、随机森林、逻辑回归等
    回归:Lasso、岭回归等
    聚类:k-means、谱聚类等
    降维:PCA、特征选择、矩阵分解等
    模型选择:网格搜索、交叉验证、指标矩阵
    预处理:特征提取、正态化
    1.6.3命名约定
    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    import seaborn as sns
    import statsmodels as sm
    一次性在Numpy这样的大包里引入所有内容(from numpy import *)在Python软件开发中被认为是拙劣。

    第二章 Python语言基础、IPython及Jupyter notebook

    2.1Python解释器
    标准的交互式Python解释器可以通过在命令行输入python命令来启动:

    
    C:\Users\lenovo>python
    Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    

    2.2.2 运行Jupyter notebook :

    F:\BaiduNetdiskDownload\Python\Scripts\jupyter-notebook>jupyter notebook
    

    执行指令后,默认浏览器自动弹出界面。

    2.2.3 Tab补全
    例如:
    2.2.4 内省
    在一个变量名前后使用?可以显示一些关于该对象的概要信息:

    如果是一个函数或者实例方法且文档字符串已经写好,则文件字符串会显示出来。例子:
    在这里插入图片描述
    使用双问号可以查看函数源代码:
    在这里插入图片描述
    ?有一个终极用途,把一些字符和通配符(星号*)结合在一起,会显示所有匹配通配符表达式的命名:
    在这里插入图片描述

    2.2.5 %run命令
    %load ___.py魔法命令可以可以将脚本导入一个代码模块
    %run命令可以执行Python程序文件如图二
    在使用%run -i ____.py时,脚本里使用的变量值为交互式IPython命名空间中已有的变量,例如图一
    图二
    图一
    2.2.5.1 中断运行中的代码
    在任意代码运行按下Ctrl-C,都将引起KeyboardInterrupt。除了特殊情况,这将导致所有的Python程序立即停止运行。
    当一段代码被其他已经编译的扩展模块调用时,按下Ctrl-C并不会使程序立即停止,在这种情况下,你需要等待控制流重新返回Python解释器,在更糟糕的情况下可能要强制结束Python进程。
    2.2.6 执行剪贴版中的程序
    %paste会获得剪贴板上的所有文本,并在命令行中作为一个代码块去执行。
    %cpaste,可以自由的在执行代码前尽可能多的粘贴代码

    2.3.1.5 变量和参数传递
    某些语言中,会是数据[1,2,3]被拷贝的过程。在Python中,a、b实际上是指向了相同的对象,即原来的[1,2,3]。证明:
    在这里插入图片描述

    本书中觉得不是太有用的内容就会直接跳过。我就想把自己每天看的书在这里写出来加深理解,有的不是太有必要我就不写了。我是新手啊,新到不能在新了,哈哈哈。

    今天先写到38页,明天继续。这是我第一次写帖子,有什么不好的明天再改
    下一节在这里《利用Python进行数据分析第二版》学习(二)

    展开全文
  • 利用python进行数据清洗

    千次阅读 多人点赞 2020-04-21 15:50:14
    在做数据分析之前,我们首先要明确数据分析的目标,然后应用数据分析的思维,对目标进行细分,再采取相应的行动。 我们可以把数据分析细分为以下 8 个步骤: (1)读取 (2)清洗 (3)操作 (4)转换 (5)整理 (6...

    在做数据分析之前,我们首先要明确数据分析的目标,然后应用数据分析的思维,对目标进行细分,再采取相应的行动。

    我们可以把数据分析细分为以下 8 个步骤:

    (1)读取
    (2)清洗
    (3)操作
    (4)转换
    (5)整理
    (6)分析
    (7)展现
    (8)报告
    下面我们用一副待清洗的扑克牌作为示例,假设它保存在代码文件相同的目录下,在 Jupyter Lab 环境中运行以下代码:

    import numpy as np
    import pandas as pd
    
    # 设置最多显示 10 行
    pd.set_option('max_rows', 10)
    
    # 从 Excel 文件中读取原始数据
    df = pd.read_excel(
        '待清洗的扑克牌数据集.xlsx'
    )
    
    df
    

    在这里插入图片描述
    这幅待清洗的扑克牌数据集,有一些异常情况,包括:大小王的花色是缺失的,有两张重复的黑桃♠️ A,还有一张异常的黑桃♠️ 30。

    1. 如何查找异常?

    在正式开始清洗数据之前,往往需要先把异常数据找出来,观察异常数据的特征,然后再决定清洗的方法。

    # 查找「花色」缺失的行
    df[df.花色.isnull()]
    

    在这里插入图片描述

    # 查找完全重复的行
    df[df.duplicated()]
    

    在这里插入图片描述

    # 查找某一列重复的行
    df[df.编号.duplicated()]
    

    在这里插入图片描述

    # 查找牌面的所有唯一值
    df.牌面.unique()
    返回结果:
    array(['大王', '小王', 'A', '30', 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 2, 3], dtype=object)
    
    根据常识可以判断,牌面为 30 的是异常值。
    
    # 查找「牌面」包含 30 的异常值
    df[df.牌面.isin(['30'])]
    

    在这里插入图片描述

    # 查找王牌,模糊匹配
    df[df.牌面.str.contains(
        '王', na=False
    )]
    

    在这里插入图片描述

    # 查找编号在 1 到 5 之间的行
    df[df.编号.between(1, 5)]
    

    在这里插入图片描述查找某个区间,也可以用逻辑运算的方法来实现:

    # 查找编号在 1 到 5 之间的行
    df[(df.编号 >= 1)
       & (df.编号 <= 5)]
    

    其中「 & 」代表必须同时满足两边的条件,也就是「且」的意思。
    还可以用下面等价的方法:

    # 查找编号在 1 到 5 之间的行
    df[~((df.编号 < 1)
         | (df.编号 > 5))]
    

    其中「 | 」代表两边的条件满足一个即可,也就是「或」的意思,「 ~ 」代表取反,也就是「非」的意思。

    2. 如何排除重复?
    使用 drop_duplicates() 函数,在排除重复之后,会得到一个新的数据框。

    # 排除完全重复的行,默认保留第一行
    df.drop_duplicates()
    

    返回结果如下:
    在这里插入图片描述
    如果想要改变原来的数据框,有两种方法,一种方法,是增加 inplace 参数:

    # 排除重复后直接替换原来的数据框
    df.drop_duplicates(
        inplace=True
    )
    

    另一种方法,是把得到的结果,重新赋值给原来的数据框:

    # 排除重复后,重新赋值给原来的数据框
    df = df.drop_duplicates()
    

    如果想要按某一列排除重复的数据,那么指定相应的列名即可。

    # 按某一列排除重复,默认保留第一行
    df.drop_duplicates(['花色'])
    

    在这里插入图片描述如果想要保留重复的最后一行,那么需要指定 keep 参数。

    # 按某一列排除重复,并保留最后一行
    df.drop_duplicates(
        ['花色'], keep='last'
    )
    

    在这里插入图片描述从上面两个返回结果的编号可以看出,不同方法的差异情况。

    3. 如何删除缺失?

    使用 dropna() 函数,默认删除包含缺失的行。为了更加简单易懂,我们用扑克牌中不重复的花色作为示例。

    # 不重复的花色
    color = df.drop_duplicates(
        ['花色']
    )
    
    color
    

    在这里插入图片描述

    # 删除包含缺失值的行
    color.dropna()
    

    在这里插入图片描述如果想要删除整行全部为空的行,那么需要指定 how 参数。

    # 删除全部为空的行
    color.dropna(how='all')
    

    在这里插入图片描述如果想要删除包含缺失值的列,那么需要指定 axis 参数。

    # 删除包含缺失值的列
    color.dropna(axis=1)
    

    在这里插入图片描述
    可以看到,包含缺失值的「花色」这一列被删除了。

    4. 如何补全缺失?
    使用 fillna() 函数,可以将缺失值填充为我们指定的值。

    # 补全缺失值
    color.fillna('Joker')
    

    在这里插入图片描述可以看到,原来的 NaN 被填充为 Joker,在实际工作的应用中,通常填充为 0,也就是说, fillna(0) 是比较常见的用法。

    如果想要使用临近的值来填充,那么需要指定 method 参数,例如:

    # 用后面的值填充
    color.fillna(method='bfill')
    

    在这里插入图片描述可以看到,原来第一行的 NaN 替换成了第二行的「黑桃♠️」。

    其中 method 还有一些其他的可选参数,详情可以查看相关的帮助文档。

    还有一种按字典填充的方法。为了让下面的演示更加直观易懂,我们先把索引为 2 的牌面设置为缺失值:

    # 为了演示,先指定一个缺失值
    color.loc[2, '牌面'] = np.nan
    
    color
    

    在这里插入图片描述

    # 按列自定义补全缺失值
    color.fillna(
        {'花色': 0, '牌面': 1}
    )
    

    在这里插入图片描述可以看出,不同列的缺失值,可以填充为不同的值,花色这一列填充为 0,牌面这一列填充为 1,我在图中分别用红色的方框标记出来了。

    5. 应用案例

    下面我们用 Python 代码,把这幅待清洗的扑克牌数据集,变成一副正常的扑克牌数据。

    import numpy as np
    import pandas as pd
    
    # 设置最多显示 10 行
    pd.set_option('max_rows', 10)
    
    # 从 Excel 文件中读取原始数据
    df = pd.read_excel(
        '待清洗的扑克牌数据集.xlsx'
    )
    
    # 补全缺失值
    df = df.fillna('Joker')
    
    # 排除重复值
    df = df.drop_duplicates()
    
    # 修改异常值
    df.loc[4, '牌面'] = 3
    
    # 增加一张缺少的牌
    df = df.append(
        {'编号': 4,
         '花色': '黑桃♠',
         '牌面': 2},
        ignore_index=True
    )
    
    # 按编号排序
    df = df.sort_values('编号')
    
    # 重置索引
    df = df.reset_index()
    
    # 删除多余的列
    df = df.drop(
        ['index'], axis=1
    )
    
    # 把清洗好的数据保存到 Excel 文件
    df.to_excel(
        '完成清洗的扑克牌数据.xlsx',
        index=False
    )
    
    df
    

    返回结果如下:
    在这里插入图片描述
    可以看到,我们已经成功地把它变成了一副正常的扑克牌数据。

    如果你想要获取本文的案例数据,请前往林骥的公众号后台回复「清洗」。

    展开全文
  • 利用Python进行数据预处理

    千次阅读 2019-02-27 16:49:54
    数据导入到python环境:http://pandas.pydata.org/pandas-docs/stable/io.html(英文版) IO Tools (Text, CSV, HDF5, ...) The pandas I/O API is a set of top level reader functions accessed like pd.read...

    数据导入到python环境:http://pandas.pydata.org/pandas-docs/stable/io.html(英文版)

    IO Tools (Text, CSV, HDF5, ...)

    The pandas I/O API is a set of top level reader functions accessed like pd.read_csv() that generally return a pandasobject.

    The corresponding writer functions are object methods that are accessed like df.to_csv()

    Here is an informal performance comparison for some of these IO methods.

    Note

     

    For examples that use the StringIO class, make sure you import it according to your Python version, i.e.from StringIO import StringIO for Python 2 and from io import StringIO for Python 3.

    中文版read_csv参数详解:

    pandas.read_csv参数详解

     

    pandas.read_csv参数整理

     

    读取CSV(逗号分割)文件到DataFrame

    也支持文件的部分导入和选择迭代

    更多帮助参见:http://pandas.pydata.org/pandas-docs/stable/io.html

    参数:

    filepath_or_buffer : str,pathlib。str, pathlib.Path, py._path.local.LocalPath or any object with a read() method (such as a file handle or StringIO)

    可以是URL,可用URL类型包括:http, ftp, s3和文件。对于多文件正在准备中

    本地文件读取实例:://localhost/path/to/table.csv

     

    sep : str, default ‘,’

    指定分隔符。如果不指定参数,则会尝试使用逗号分隔。分隔符长于一个字符并且不是‘\s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:'\r\t'

     

    delimiter : str, default None

    定界符,备选分隔符(如果指定该参数,则sep参数失效)

     

    delim_whitespace : boolean, default False.

    指定空格(例如’ ‘或者’ ‘)是否作为分隔符使用,等效于设定sep='\s+'。如果这个参数设定为Ture那么delimiter 参数失效。

    在新版本0.18.1支持

     

    header : int or list of ints, default ‘infer’

    指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。如果明确设定header=0 就会替换掉原来存在列名。header参数可以是一个list例如:[0,1,3],这个list表示将文件中的这些行作为列标题(意味着每一列有多个标题),介于中间的行将被忽略掉(例如本例中的2;本例中的数据1,2,4行将被作为多级标题出现,第3行数据将被丢弃,dataframe的数据从第5行开始。)。

    注意:如果skip_blank_lines=True 那么header参数忽略注释行和空行,所以header=0表示第一行数据而不是文件的第一行。

     

    names : array-like, default None

    用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。默认列表中不能出现重复,除非设定参数mangle_dupe_cols=True。

     

    index_col : int or sequence or False, default None

    用作行索引的列编号或者列名,如果给定一个序列则有多个行索引。

    如果文件不规则,行尾有分隔符,则可以设定index_col=False 来是的pandas不适用第一列作为行索引。

     

    usecols : array-like, default None

    返回一个数据子集,该列表中的值必须可以对应到文件中的位置(数字可以对应到指定的列)或者是字符传为文件中的列名。例如:usecols有效参数可能是 [0,1,2]或者是 [‘foo’, ‘bar’, ‘baz’]。使用这个参数可以加快加载速度并降低内存消耗。

     

    as_recarray : boolean, default False

    不赞成使用:该参数会在未来版本移除。请使用pd.read_csv(...).to_records()替代。

    返回一个Numpy的recarray来替代DataFrame。如果该参数设定为True。将会优先squeeze参数使用。并且行索引将不再可用,索引列也将被忽略。

     

    squeeze : boolean, default False

    如果文件值包含一列,则返回一个Series

     

    prefix : str, default None

    在没有列标题时,给列添加前缀。例如:添加‘X’ 成为 X0, X1, ...

     

    mangle_dupe_cols : boolean, default True

    重复的列,将‘X’...’X’表示为‘X.0’...’X.N’。如果设定为false则会将所有重名列覆盖。

     

    dtype : Type name or dict of column -> type, default None

    每列数据的数据类型。例如 {‘a’: np.float64, ‘b’: np.int32}

     

    engine : {‘c’, ‘python’}, optional

    Parser engine to use. The C engine is faster while the python engine is currently more feature-complete.

    使用的分析引擎。可以选择C或者是python。C引擎快但是Python引擎功能更加完备。

     

    converters : dict, default None

    列转换函数的字典。key可以是列名或者列的序号。

     

    true_values : list, default None

    Values to consider as True

     

    false_values : list, default None

    Values to consider as False

     

    skipinitialspace : boolean, default False

    忽略分隔符后的空白(默认为False,即不忽略).

     

    skiprows : list-like or integer, default None

    需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)。

     

    skipfooter : int, default 0

    从文件尾部开始忽略。 (c引擎不支持)

     

    skip_footer : int, default 0

    不推荐使用:建议使用skipfooter ,功能一样。

     

    nrows : int, default None

    需要读取的行数(从文件头开始算起)。

     

    na_values : scalar, str, list-like, or dict, default None

    一组用于替换NA/NaN的值。如果传参,需要制定特定列的空值。默认为‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’`.

     

    keep_default_na : bool, default True

    如果指定na_values参数,并且keep_default_na=False,那么默认的NaN将被覆盖,否则添加。

     

    na_filter : boolean, default True

    是否检查丢失值(空字符串或者是空值)。对于大文件来说数据集中没有空值,设定na_filter=False可以提升读取速度。

     

    verbose : boolean, default False

    是否打印各种解析器的输出信息,例如:“非数值列中缺失值的数量”等。

     

    skip_blank_lines : boolean, default True

    如果为True,则跳过空行;否则记为NaN。

     

    parse_dates : boolean or list of ints or names or list of lists or dict, default False

    • boolean. True -> 解析索引
    • list of ints or names. e.g. If [1, 2, 3] -> 解析1,2,3列的值作为独立的日期列;
    • list of lists. e.g. If [[1, 3]] -> 合并1,3列作为一个日期列使用
    • dict, e.g. {‘foo’ : [1, 3]} -> 将1,3列合并,并给合并后的列起名为"foo"

     

    infer_datetime_format : boolean, default False

    如果设定为True并且parse_dates 可用,那么pandas将尝试转换为日期类型,如果可以转换,转换方法并解析。在某些情况下会快5~10倍。

     

    keep_date_col : boolean, default False

    如果连接多列解析日期,则保持参与连接的列。默认为False。

     

    date_parser : function, default None

    用于解析日期的函数,默认使用dateutil.parser.parser来做转换。Pandas尝试使用三种不同的方式解析,如果遇到问题则使用下一种方式。

    1.使用一个或者多个arrays(由parse_dates指定)作为参数;

    2.连接指定多列字符串作为一个列作为参数;

    3.每行调用一次date_parser函数来解析一个或者多个字符串(由parse_dates指定)作为参数。

     

    dayfirst : boolean, default False

    DD/MM格式的日期类型

     

    iterator : boolean, default False

    返回一个TextFileReader 对象,以便逐块处理文件。

     

    chunksize : int, default None

    文件块的大小, See IO Tools docs for more informationon iterator and chunksize.

     

    compression : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’

    直接使用磁盘上的压缩文件。如果使用infer参数,则使用 gzip, bz2, zip或者解压文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’这些为后缀的文件,否则不解压。如果使用zip,那么ZIP包中国必须只包含一个文件。设置为None则不解压。

    新版本0.18.1版本支持zip和xz解压

     

    thousands : str, default None

    千分位分割符,如“,”或者“."

     

    decimal : str, default ‘.’

    字符中的小数点 (例如:欧洲数据使用’,‘).

     

    float_precision : string, default None

    Specifies which converter the C engine should use for floating-point values. The options are None for the ordinary converter, high for the high-precision converter, and round_trip for the round-trip converter.

    指定

     

    lineterminator : str (length 1), default None

    行分割符,只在C解析器下使用。

     

    quotechar : str (length 1), optional

    引号,用作标识开始和解释的字符,引号内的分割符将被忽略。

     

    quoting : int or csv.QUOTE_* instance, default 0

    控制csv中的引号常量。可选 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)

     

    doublequote : boolean, default True

    双引号,当单引号已经被定义,并且quoting 参数不是QUOTE_NONE的时候,使用双引号表示引号内的元素作为一个元素使用。

     

    escapechar : str (length 1), default None

    当quoting 为QUOTE_NONE时,指定一个字符使的不受分隔符限值。

     

    comment : str, default None

    标识着多余的行不被解析。如果该字符出现在行首,这一行将被全部忽略。这个参数只能是一个字符,空行(就像skip_blank_lines=True)注释行被header和skiprows忽略一样。例如如果指定comment='#' 解析‘#empty\na,b,c\n1,2,3’ 以header=0 那么返回结果将是以’a,b,c'作为header。

     

    encoding : str, default None

    指定字符集类型,通常指定为'utf-8'. List of Python standard encodings

     

    dialect : str or csv.Dialect instance, default None

    如果没有指定特定的语言,如果sep大于一个字符则忽略。具体查看csv.Dialect 文档

     

    tupleize_cols : boolean, default False

    Leave a list of tuples on columns as is (default is to convert to a Multi Index on the columns)

     

    error_bad_lines : boolean, default True

    如果一行包含太多的列,那么默认不会返回DataFrame ,如果设置成false,那么会将改行剔除(只能在C解析器下使用)。

     

    warn_bad_lines : boolean, default True

    如果error_bad_lines =False,并且warn_bad_lines =True 那么所有的“bad lines”将会被输出(只能在C解析器下使用)。

     

    low_memory : boolean, default True

    分块加载到内存,再低内存消耗中解析。但是可能出现类型混淆。确保类型不被混淆需要设置为False。或者使用dtype 参数指定类型。注意使用chunksize 或者iterator 参数分块读入会将整个文件读入到一个Dataframe,而忽略类型(只能在C解析器中有效)

     

    buffer_lines : int, default None

    不推荐使用,这个参数将会在未来版本移除,因为他的值在解析器中不推荐使用

     

    compact_ints : boolean, default False

    不推荐使用,这个参数将会在未来版本移除

    如果设置compact_ints=True ,那么任何有整数类型构成的列将被按照最小的整数类型存储,是否有符号将取决于use_unsigned 参数

     

    use_unsigned : boolean, default False

    不推荐使用:这个参数将会在未来版本移除

    如果整数列被压缩(i.e. compact_ints=True),指定被压缩的列是有符号还是无符号的。

    memory_map : boolean, default False

    如果使用的文件在内存内,那么直接map文件使用。使用这种方式可以避免文件再次进行IO操作。

     

     

    数据预处理过程:http://www.kuqin.com/shuoit/20160206/350580.html

    导语

    Python正迅速成为数据科学家偏爱的语言,这合情合理。它拥有作为一种编程语言广阔的生态环境以及众多优秀的科学计算库。如果你刚开始学习Python,可以先了解一下Python的学习路线。
    在众多的科学计算库中,我认为Pandas对数据科学运算最有用。Pandas,加上Scikit-learn几乎能构成了数据科学家所需的全部工具。本文旨在提供Python数据处理的12种方法。文中也分享了一些会让你的工作更加便捷的小技巧。
    在继续推进之前,我推荐读者阅览一些关于数据探索 (data exploration)的代码。
    为了帮助理解,本文用一个具体的数据集进行运算和操作。本文使用了贷款预测(loan prediction) 问题数据集,下载数据集请到http://datahack.analyticsvidhya.com/contest/practice-problem-loan-prediction。

    开始工作

    首先我要导入要用的模块,并把数据集载入Python环境。

     import pandas as pd  import numpy as np  data = pd.read_csv("train.csv", index_col="Loan_ID") 
    

    1.布尔索引(Boolean Indexing)

    如何你想用基于某些列的条件筛选另一列的值,你会怎么做?例如,我们想要一个全部无大学学历但有贷款的女性列表。这里可以使用布尔索引。代码如下:

    
     data.loc[(data["Gender"]=="Female") & (data["Education"]=="Not 
    Graduate") & (data["Loan_Status"]=="Y"), 
    ["Gender","Education","Loan_Status"]] 
    


    想了解更多请阅读 Pandas Selecting and Indexing

    2.Apply函数

    Apply是摆弄数据和创造新变量时常用的一个函数。Apply把函数应用于数据框的特定行/列之后返回一些值。这里的函数既可以是系统自带的也可以是用户定义的。例如,此处可以用它来寻找每行每列的缺失值个数:

    
     #创建一个新函数:  def num_missing(x):    return sum(x.isnull())  #Apply到每一列:  
    print "Missing values per column:"  print data.apply(num_missing, 
    axis=0) #axis=0代表函数应用于每一列  #Apply到每一行:  print "nMissing values per row:"
      print data.apply(num_missing, axis=1).head() #axis=1代表函数应用于每一行 
    

    输出结果:

    由此我们得到了想要的结果。
    注意:第二个输出使用了head()函数,因为数据包含太多行。
    想了解更多请阅读 Pandas Reference (apply)

    3.替换缺失值

    ‘fillna()’ 可以一次解决这个问题。它被用来把缺失值替换为所在列的平均值/众数/中位数。

     #首先导入一个寻找众数的函数:  from scipy.stats import mode  mode(data['Gender']) 
    

    输出: ModeResult(mode=array([‘Male’], dtype=object), count=array([489]))
    返回了众数及其出现次数。记住,众数可以是个数组,因为高频的值可能不只一个。我们通常默认使用第一个:

     mode(data['Gender']).mode[0] 
    


    现在可以填补缺失值,并用上一步的技巧来检验。

    
     #值替换:  data['Gender'].fillna(mode(data['Gender']).mode[0], 
    inplace=True)  data['Married'].fillna(mode(data['Married']).mode[0], 
    inplace=True)  
    data['Self_Employed'].fillna(mode(data['Self_Employed']).mode[0], 
    inplace=True)  #再次检查缺失值以确认:  print data.apply(num_missing, axis=0) 
    


    由此可见,缺失值确定被替换了。请注意这是最基本的替换方式,其他更复杂的技术,如为缺失值建模、用分组平均数(平均值/众数/中位数)填充,会在今后的文章提到。
    想了解更多请阅读 Pandas Reference (fillna)

    4.透视表

    Pandas可以用来创建 Excel式的透视表。例如,“LoanAmount”这个重要的列有缺失值。我们可以用根据 ‘Gender’、‘Married’、‘Self_Employed’分组后的各组的均值来替换缺失值。每个组的 ‘LoanAmount’可以用如下方法确定:

    
     #Determine pivot table  impute_grps = 
    data.pivot_table(values=["LoanAmount"], 
    index=["Gender","Married","Self_Employed"], aggfunc=np.mean)  print 
    impute_grps 
    


    想了解更多请阅读 Pandas Reference (Pivot Table)

    5.多重索引

    你可能注意到上一步骤的输出有个奇怪的性质。每个索引都是由三个值组合而成。这叫做多重索引。它可以帮助运算快速进行。
    延续上面的例子,现在我们有了每个分组的值,但还没有替换。这个任务可以用现在学过的多个技巧共同完成。

    
     #只在带有缺失值的行中迭代:  for i,row in 
    data.loc[data['LoanAmount'].isnull(),:].iterrows():    ind = 
    tuple([row['Gender'],row['Married'],row['Self_Employed']])    
    data.loc[i,'LoanAmount'] = impute_grps.loc[ind].values[0]  #再次检查缺失值以确认: 
     print data.apply(num_missing, axis=0) 
    


    注:

    多重索引需要在loc中用到定义分组group的元组(tuple)。这个元组会在函数中使用。
    需要使用.values[0]后缀。因为默认情况下元素返回的顺序与原数据库不匹配。在这种情况下,直接指派会返回错误。

    6. 二维表

    这个功能可被用来获取关于数据的初始“印象”(观察)。这里我们可以验证一些基本假设。例如,本例中“Credit_History” 被认为对欠款状态有显著影响。可以用下面这个二维表进行验证:

     pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True) 
    


    这些数字是绝对数值。不过,百分比数字更有助于快速了解数据。我们可以用apply函数达到目的:

    
     def percConvert(ser):    return ser/float(ser[-1])    
    pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True).apply(percConvert,
     axis=1) 
    


    现在可以很明显地看出,有信用记录的人获得贷款的可能性更高:有信用记录的人有80% 获得了贷款,没有信用记录的人只有 9% 获得了贷款。
    但不仅仅是这样,其中还包含着更多信息。由于我现在知道了有信用记录与否非常重要,如果用信用记录来预测是否会获得贷款会怎样?令人惊讶的是,在614次试验中我们能预测正确460次,足足有75%!
    如果此刻你在纳闷,我们要统计模型有什么用,我不会怪你。但相信我,在此基础上提高0.001%的准确率都是充满挑战性的。你是否愿意接受这个挑战?
    注:对训练集而言是75% 。在测试集上有些不同,但结果相近。同时,我希望这个例子能让人明白,为什么提高0.05% 的正确率就能在Kaggle排行榜上跳升500个名次。
    想了解更多请阅读Pandas Reference (crosstab)

    用 Python 做数据处理必看:12 个使效率倍增的 Pandas 技巧(上)《用 Python 做数据处理必看:12 个使效率倍增的 Pandas 技巧》

    7 – 数据框合并

    当我们有收集自不同来源的数据时,合并数据框就变得至关重要。假设对于不同的房产类型,我们有不同的房屋均价数据。让我们定义这样一个数据框:

     prop_rates = pd.DataFrame([1000, 5000, 12000], index=['Rural','Semiurban','Urban'],columns=['rates'])  prop_rates 
    


    现在可以把它与原始数据框合并:

    
     data_merged = data.merge(right=prop_rates, 
    how='inner',left_on='Property_Area',right_index=True, sort=False)  
    data_merged.pivot_table(values='Credit_History',index=['Property_Area','rates'],
     aggfunc=len) 
    


    这张透视表验证了合并成功。注意这里的 ‘values’无关紧要,因为我们只是单纯计数。
    想了解更多请阅读Pandas Reference (merge)

    8 – 给数据框排序

    Pandas可以轻松基于多列排序。方法如下:

    
     data_sorted = data.sort_values(['ApplicantIncome','CoapplicantIncome'],
     ascending=False)  
    data_sorted[['ApplicantIncome','CoapplicantIncome']].head(10) 
    


    注:Pandas 的“sort”函数现在已经不推荐使用,我们用 “sort_values”函数代替。
    想了解更多请阅读Pandas Reference (sort_values)

    9 – 绘图(箱型图&直方图)

    许多人可能没意识到Pandas可以直接绘制箱型图和直方图,不必单独调用matplotlib。只需要一行代码。举例来说,如果我们想根据贷款状态Loan_Status来比较申请者收入ApplicantIncome:

     data.boxplot(column="ApplicantIncome",by="Loan_Status") 
    

     data.hist(column="ApplicantIncome",by="Loan_Status",bins=30) 
    


    可以看出获得/未获得贷款的人没有明显的收入差异,即收入不是决定性因素。
    想了解更多请阅读Pandas Reference (hist) | Pandas Reference (boxplot)

    10 – 用Cut函数分箱

    有时把数值聚集在一起更有意义。例如,如果我们要为交通状况(路上的汽车数量)根据时间(分钟数据)建模。具体的分钟可能不重要,而时段如“上午”“下午”“傍晚”“夜间”“深夜”更有利于预测。如此建模更直观,也能避免过度拟合。
    这里我们定义一个简单的、可复用的函数,轻松为任意变量分箱。

    
     #分箱:  def binning(col, cut_points, labels=None):    #Define min and max
     values:    minval = col.min()    maxval = col.max()    
    #利用最大值和最小值创建分箱点的列表    break_points = [minval] + cut_points + [maxval]   
     #如果没有标签,则使用默认标签0 ... (n-1)    if not labels:      labels = 
    range(len(cut_points)+1)    #使用pandas的cut功能分箱    colBin = 
    pd.cut(col,bins=break_points,labels=labels,include_lowest=True)    
    return colBin    #为年龄分箱:  cut_points = [90,140,190]  labels = 
    ["low","medium","high","very high"]  data["LoanAmount_Bin"] = 
    binning(data["LoanAmount"], cut_points, labels)  print 
    pd.value_counts(data["LoanAmount_Bin"], sort=False) 
    


    想了解更多请阅读 Pandas Reference (cut)

    11 – 为分类变量编码

    有时,我们会面对要改动分类变量的情况。原因可能是:

    有些算法(如罗吉斯回归)要求所有输入项目是数字形式。所以分类变量常被编码为0, 1….(n-1)
    有时同一个分类变量可能会有两种表现方式。如,温度可能被标记为“High”, “Medium”, “Low”,“H”, “low”。这里 “High” 和 “H”都代表同一类别。同理, “Low” 和“low”也是同一类别。但Python会把它们当作不同的类别。
    一些类别的频数非常低,把它们归为一类是个好主意。

    这里我们定义了一个函数,以字典的方式输入数值,用‘replace’函数进行编码。

    
     #使用Pandas replace函数定义新函数:  def coding(col, codeDict):    colCoded = 
    pd.Series(col, copy=True)    for key, value in codeDict.items():      
    colCoded.replace(key, value, inplace=True)    return colCoded   ​  
    #把贷款状态LoanStatus编码为Y=1, N=0:  print 'Before Coding:'  print 
    pd.value_counts(data["Loan_Status"])  data["Loan_Status_Coded"] = 
    coding(data["Loan_Status"], {'N':0,'Y':1})  print 'nAfter Coding:'  
    print pd.value_counts(data["Loan_Status_Coded"]) 
    


    编码前后计数不变,证明编码成功。
    想了解更多请阅读 Pandas Reference (replace)

    12 – 在一个数据框的各行循环迭代

    这不是一个常见的操作。但你总不想卡在这里吧?有时你会需要用一个for循环来处理每行。例如,一个常见的问题是变量处置不当。通常见于以下情况:

    带数字的分类变量被当做数值。
    (由于出错)带文字的数值变量被当做分类变量。

    所以通常来说手动定义变量类型是个好主意。如我们检查各列的数据类型:

     #检查当前数据类型:  data.dtypes 
    


    这里可以看到分类变量Credit_History被当作浮点数。对付这个问题的一个好办法是创建一个包含变量名和类型的csv文件。通过这种方法,我们可以定义一个函数来读取文件,并为每列指派数据类型。举例来说,我们创建了csv文件datatypes.csv

     

     #载入文件:  colTypes = pd.read_csv('datatypes.csv')  print colTypes 
    


    载入这个文件之后,我们能对每行迭代,把用‘type’列把数据类型指派到‘feature’ 列对应的项目。

    
     #迭代每行,指派变量类型。  #注,astype用来指定变量类型。  for i, row in colTypes.iterrows(): 
    #i: dataframe索引; row: 连续的每行      if row['feature']=="categorical":      
    data[row['feature']]=data[row['feature']].astype(np.object)    elif 
    row['feature']=="continuous":      
    data[row['feature']]=data[row['feature']].astype(np.float)    print 
    data.dtypes 
    

    现在信用记录这一列的类型已经成了‘object’ ,这在Pandas中代表分类变量。
    想了解更多请阅读Pandas Reference (iterrows)

    结语

    本文中我们介绍了多个可以帮助我们减轻数据探索、特征工程工作负担的函数。此外,我们也定义了一些函数,这些函数可以在不同的数据集上复用以获得相同效果。

    参考文献:

          python数据分析入门——数据导入数据预处理基本操作

     

    展开全文
  • 系列一:《python数据分析基础与实践》 章节1Python概况 课时2Python简介 章节2Python安装 课时3安装Anaconda 课时4使用Anaconda 章节3数据准备 课时5数据类型 – 布尔型 课时6数据类型 – 数值型 课时7数据类型 – ...
  • 利用Python进行数据分析 —— CSV文件

    千次阅读 2019-04-10 13:25:31
    逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被...
  • Python爬虫,除了使用大家广为使用的scrapy架构外,还有很多包能够实现一些简单的爬虫,如BeautifulSoup、Urllib、requests,在使用这些包时,有的网络因为比较复杂,比较难以找到自己想要的代码,在这个时候,如果...
  • 特征检测是计算机对一张图像中最为明显的特征进行识别检测并将其勾画出来。大多数特征检测都会涉及图像的角点、边和斑点的识别、或者是物体的对称轴。 角点检测 是由Opencv的cornerHarris函数实现,其他函数参数...
  • python爬虫实战,爬取拉勾网全站职位(CrawlSpider),思路如下: 1.首先类似于 https://www.lagou.com/jobs/2182417.html 这样的链接是最终要的url。基本都是差不多,要变的就是那一串数字,编写正则表达式匹配就...
  • 金融经济数据方面应用Python非常广泛,也可以算是用Python进行数据分析的一个实际应用。数据规整化方面的应用时间序列与截面对齐在处理金融数据时,最费神的一个问题就是所谓的“数据对齐” (data alignment)问题...
  • python进行数据清洗

    千次阅读 2020-09-27 21:18:52
    第二是让数据变的更适合进行后续的分析工作。 通常来说,你所获取到的原始数据不能直接用来分析,因为它们会有各种各样的问题,如包含无效信息,列名不规范、格式不一致,存在重复值,缺失值,异常值等… 本篇文章将...
  • Python 匹配两组(或多组)数据

    千次阅读 2021-08-02 12:53:49
    数据a是否在数据b里面,一开始写了个for循环去匹配,可数据量大,慢到爆炸。 而且某个人也说,用for循环处理大数据,是要被人打的。 python处理该问题,目前为止有两种方法。 使用set集合的intersection交集 a = ...
  • 我的第一次工作上实现Python代码堆积 生物行业一名普通的实验搬砖者,半路出家学习Python…… 0. 为什么会写这个脚本 目前所做的项目对数据整理需求比较大,数据...读取源文件和目标文件中可用作判断的数据进行遍...
  • Python进行数据分析的一种很不错的语言,主要是因为以数据为中心的库非常适合。 Pandas是其中的一种,使导入和分析数据更加容易。 在本文中,我使用了来分析斯坦福网站的公共数据集中的Country Data.csv文件中的...
  • 利用python对csv文件进行简单的数据分析 在通过爬虫爬取数据后,将数据放到csv文件里,为了方便观察,可以对数据进行简单的分析。下面我将对爬取的51job招聘数据中的薪资进行求平均值以及中位数操作 1.爬取数据 下面...
  • 我们在excel 利用简单的VLOOKUP函数进行数据匹配后得到如下: 这里意思是 江南摩尔店,平湖新华中路 属于浙北大区以此类推。 小区 门店 浙北大区 江南摩尔店 浙北大区 平湖新华中路 浙北大区 上虞青春店 ...
  • 手把手教你使用Python数据分析

    千次阅读 2021-05-20 11:00:53
    数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,将它们加以汇总和理解并消化,以求最大化地开发数据的功能,发挥数据的作用,使得数据的价值最大化 二、数据分析是做什么的 数据分析是为了提取有用...
  • 通过python处理网页页面数据,获取想要的数据链接。BeautifulSoup的用法,获取到H5页面的元素后,对H5页面元素根据想要获取的元素获取对应的元素列表。获取到的元素列表进行正则匹配获取到想要的链接。
  • Python】模糊匹配搜索

    千次阅读 2020-11-19 15:36:15
    利用python库:fuzzywuzzy及difflib,两个库均可实现词粒度的模糊匹配,同时可设定模糊阈值,实现关键词的提取、地址匹配、语法检查等 2. fuzzywuzzy pip install fuzzywuzzy from fuzzywuzzy import process ...
  • ![主函数中的代码]... !... !... ...请问我的如果我的abc里存放了一些id,我想要把abc里的id逐一的与.csv文件的movieId进行匹配,找到相同的id后输出这个movieId对应的title
  • 地理数据通常包括地市\省份\经纬度等信息,这些不同level的特征可以被利用在模型训练中。 但是通常我们能拿到的数据只是部分信息,如果想要增加特征维度,Python的geopy是一个获取geographic data很好的package。它...
  • python匹配字符

    千次阅读 2020-12-02 16:24:51
    假设我有一个名为file1.txt的下面的文本文件:adam malejohn malemike malesue female 我有下面的清单 fullname=我希望能够通过文本文件,如果它有任何匹配,修改带有找到的单词的行,输出应如下所示:adam malejohn...
  • Python/对excel进行数据分析 (mark)

    万次阅读 多人点赞 2018-12-05 16:12:01
    Python对excel进行分析 &amp;amp;amp;nbsp; 目前有一个excel表,其中里面有一个工作薄的名称为:btc,在这个工作薄中有2013年–2018年的所有交易数据,本文主要实现,将不同的年份的数据保存至新的工作薄并起名...
  • Python实现列表匹配

    万次阅读 2018-06-09 22:40:00
    进行文章的最佳匹配与推荐,思路是以15个分词作为特征,进行list与list之间的交集运算。我们认为交集元素数目最多的最匹配,一样多的情况下,分词的序号(例如分词1、分词3、分词10的1、3、10)代表着其重要性,...
  • 字典树,又称单词查找树,用于统计排序和保存大量的字符串,可以快速找到句子中匹配的子串。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,737
精华内容 34,694
关键字:

利用python如何进行数据匹配