pandas python 寻找_python数据存储系列教程—python(pandas) - CSDN
精华内容
参与话题
  • pythonpandas简单介绍及使用(一)

    万次阅读 多人点赞 2019-06-13 11:00:45
    一、 Pandas简介 1、Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具...

    一、  Pandas简介

    1、Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

    2、Pandas 是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。

    3、数据结构:

    Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。

    Time- Series:以时间为索引的Series。

    DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。

    Panel :三维的数组,可以理解为DataFrame的容器。

    Pandas 有两种自己独有的基本数据结构。读者应该注意的是,它固然有着两种数据结构,因为它依然是 Python 的一个库,所以,Python 中有的数据类型在这里依然适用,也同样还可以使用类自己定义数据类型。只不过,Pandas 里面又定义了两种数据类型:Series 和 DataFrame,它们让数据操作更简单了。

    二、  Pandas安装

    因为pandas是python的第三方库所以使用前需要安装一下,直接使用pip install pandas 就会自动安装pandas以及相关组件。

    三、  Pandas使用

    注:本次操作是在ipython中进行

    1、导入pandas模块并使用别名,以及导入Series模块,以下使用基于本次导入。

    In [1]: from pandas import Series

    In [2]: import pandas as pd

    2、Series

    Series 就如同列表一样,一系列数据,每个数据对应一个索引值。

    Series 就是“竖起来”的 list:

    In [3]: s = Series([1,4,'ww','tt'])

    In [4]: s
    Out[4]:
    0   1
    1   4
    2   ww
    3   tt
    dtype: object

    另外一点也很像列表,就是里面的元素的类型,由你任意决定(其实是由需要来决定)。

    这里,我们实质上创建了一个 Series 对象,这个对象当然就有其属性和方法了。比如,下面的两个属性依次可以显示 Series 对象的数据值和索引:

    In [5]: s.index
    Out[5]: RangeIndex(start=0, stop=4, step=1)

    In [8]: s.values
    Out[8]: array([1, 4, 'ww', 'tt'], dtype=object)

    列表的索引只能是从 0 开始的整数,Series 数据类型在默认情况下,其索引也是如此。不过,区别于列表的是,Series 可以自定义索引

    In [9]: s2 = Series(['wangxing','man',24],index=['name','sex','age'])

    In [10]: s2
    Out[10]:
    name    wangxing
    sex       man
    age      24
    dtype: object

    每个元素都有了索引,就可以根据索引操作元素了。还记得 list 中的操作吗?Series 中,也有类似的操作。先看简单的,根据索引查看其值和修改其值

    In [12]: s2['name']
    Out[12]: 'wangxing'

    In [45]: s2['name'] = 'wudadiao'

    In [46]: s2
    Out[46]:
    name    wudadiao
    sex    man
    age   24
    dtype: object

    这是不是又有点类似 dict 数据了呢?的确如此。看下面就理解了。

    读者是否注意到,前面定义 Series 对象的时候,用的是列表,即 Series() 方法的参数中,第一个列表就是其数据值,如果需要定义 index,放在后面,依然是一个列表。除了这种方法之外,还可以用下面的方法定义 Series 对象:

    In [13]: sd = {'python':9000,'c++':9001,'c#':9000}

    In [14]: s3 = Series(sd)

    In [15]: s3
    Out[15]:
    c#    9000
    c++    9001
    python   9000
    dtype: int64

    现在是否理解为什么前面那个类似 dict 了?因为本来就是可以这样定义的

    这时候,索引依然可以自定义。Pandas 的优势在这里体现出来,如果自定义了索引,自定的索引会自动寻找原来的索引,如果一样的,就取原来索引对应的值,这个可以简称为“自动对齐”。

    In [16]: s4 = Series(sd,index=['java','c++','c#'])

    In [17]: s4
    Out[17]:
    java    NaN
    c++    9001.0
    c#    9000.0
    dtype: float64

    在 Pandas 中,如果没有值,都对齐赋给 NaN。

    Pandas 有专门的方法来判断值是否为空。

    In [19]: pd.isnull(s4)
    Out[19]:
    java    True
    c++   False
    c#    False
    dtype: bool

    此外,Series 对象也有同样的方法:

    In [20]: s4.isnull()
    Out[20]:
    java    True
    c++   False
    c#    False
    dtype: bool

    其实,对索引的名字,是可以从新定义的:

    In [21]: s4.index = ['语文','数学','English']

    In [22]: s4
    Out[22]:
    语文    NaN
    数学   9001.0
    English    9000.0
    dtype: float64

    对于 Series 数据,也可以做类似下面的运算(关于运算,后面还要详细介绍):

    In [23]: s4 * 2
    Out[23]:
    语文    NaN
    数学    18002.0
    English    18000.0
    dtype: float64

    In [24]: s4[s4 > 9000]
    Out[24]:
    数学 9001.0
    dtype: float64

    Series就先简要写到这,下面看pandas的另一种数据结构DataFrame.

    DataFrame

    DataFrame 是一种二维的数据结构,非常接近于电子表格或者类似 mysql 数据库的形式。它的竖行称之为 columns,横行跟前面的 Series 一样,称之为 index,也就是说可以通过 columns 和 index 来确定一个主句的位置。

    首先来导入模块

    In [27]: from pandas import Series,DataFrame

    In [26]: data = {"name":['google','baidu','yahoo'],"marks":[100,200,300],"price":[1,2,3]}

    In [28]: f1 = DataFrame(data)

    In [29]: f1
    Out[29]:
      marks   name    price
    0    100    google    1
    1    200    baidu    2
    2   300    yahoo    3

    这是定义一个 DataFrame 对象的常用方法——使用 dict 定义。字典的“键”("name","marks","price")就是 DataFrame 的 columns 的值(名称),字典中每个“键”的“值”是一个列表,它们就是那一竖列中的具体填充数据。上面的定义中没有确定索引,所以,按照惯例(Series 中已经形成的惯例)就是从 0 开始的整数。从上面的结果中很明显表示出来,这就是一个二维的数据结构(类似 excel 或者 mysql 中的查看效果)。

    上面的数据显示中,columns 的顺序没有规定,就如同字典中键的顺序一样,但是在 DataFrame 中,columns 跟字典键相比,有一个明显不同,就是其顺序可以被规定,向下面这样做:

    In [31]: f2 = DataFrame(data,columns=['name','price','marks'])

    In [32]: f2
    Out[32]:
      name    price    marks
    0  google   1        100
    1  baidu    2         200
    2  yahoo   3         300

    跟 Series 类似的,DataFrame 数据的索引也能够自定义

    In [35]: f3 = DataFrame(data,columns=['name','marks','price'],index=['a','b','c'])

    In [36]: f3
    Out[36]:
      name    marks    price
    a   google      100        1
    b     baidu          200       2
    c     yahoo         300            3

    定义 DataFrame 的方法,除了上面的之外,还可以使用“字典套字典”的方式。

    In [40]: newdata = {'lang':{'first':'python','second':'java'},'price':{'first':5000,'second':2000}}

    In [41]: f4 = DataFrame(newdata)

    In [42]: f4
    Out[42]:
        lang    price
    first   python   5000
    second   java    2000

    在字典中就规定好数列名称(第一层键)和每横行索引(第二层字典键)以及对应的数据(第二层字典值),也就是在字典中规定好了每个数据格子中的数据,没有规定的都是空。

    DataFrame 对象的 columns 属性,能够显示素有的 columns 名称。并且,还能用下面类似字典的方式,得到某竖列的全部内容(当然包含索引):
    >>> newdata = {"lang":{"firstline":"python","secondline":"java"}, "price":{"firstline":8000}} 
    >>> f4 = DataFrame(newdata) 
    >>> f4 
                  lang     price 
    firstline     python   8000 
    secondline    java     NaN 
    >>> DataFrame(newdata, index=["firstline","secondline","thirdline"]) 
                  lang     price 
    firstline     python   8000 
    secondline    java     NaN 
    thirdline     NaN      NaN 
    
    DataFrame 对象的 columns 属性,能够显示素有的 columns 名称。并且,还能用下面类似字典的方式,得到某竖列的全部内容(当然包含索引):
    

    In [44]: f3['name']
    Out[44]:
    a google
    b baidu
    c yahoo
    Name: name, dtype: object

    下面操作是给同一列赋值

    newdata1 = {'username':{'first':'wangxing','second':'dadiao'},'age':{'first':24,'second':25}}

    In [67]: f6 = DataFrame(newdata1,columns=['username','age','sex'])

    In [68]: f6
    Out[68]:
      username    age    sex
    first wangxing    24    NaN
    second dadiao   25    NaN

    In [69]: f6['sex'] = 'man'

    In [70]: f6
    Out[70]:
      username  age    sex
    first wangxing   24    man
    second dadiao   25    man

    可以单独的赋值,除了能够统一赋值之外,还能够“点对点”添加数值,结合前面的 Series,既然 DataFrame 对象的每竖列都是一个 Series 对象,那么可以先定义一个 Series 对象,然后把它放到 DataFrame 对象中。如下:

    ssex = Series(['男','女'],index=['first','second'])

    In [72]: f6['sex'] = ssex

    In [73]: f6
    Out[73]:
      username    age   sex
    first wangxing     24      男
    second dadiao    25    女

    还可以更精准的修改数据吗?当然可以,完全仿照字典的操作:

    In [74]: f6['age']['second'] = 30

    In [75]: f6
    Out[75]:
      username    age    sex
    first wangxing    24          男
    second dadiao   30     女

    参考http://wiki.jikexueyuan.com/project/start-learning-python/312.html所整理。

    展开全文
  • 1、Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量...

    转自: https://www.cnblogs.com/misswangxing/p/7903595.html

    一、  Pandas简介

    1、Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

    2、Pandas 是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。

    3、数据结构:

    Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。

    Time- Series:以时间为索引的Series。

    DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。

    Panel :三维的数组,可以理解为DataFrame的容器。

    Pandas 有两种自己独有的基本数据结构。读者应该注意的是,它固然有着两种数据结构,因为它依然是 Python 的一个库,所以,Python 中有的数据类型在这里依然适用,也同样还可以使用类自己定义数据类型。只不过,Pandas 里面又定义了两种数据类型:Series 和 DataFrame,它们让数据操作更简单了。

    二、  Pandas安装

    因为pandas是python的第三方库所以使用前需要安装一下,直接使用pip install pandas 就会自动安装pandas以及相关组件。

    三、  Pandas使用

    注:本次操作是在ipython中进行

    1、导入pandas模块并使用别名,以及导入Series模块,以下使用基于本次导入。

    In [1]: from pandas import Series

    In [2]: import pandas as pd

    2、Series

    Series 就如同列表一样,一系列数据,每个数据对应一个索引值。

    Series 就是“竖起来”的 list:

    In [3]: s = Series([1,4,'ww','tt'])

    In [4]: s
    Out[4]:
    0   1
    1   4
    2   ww
    3   tt
    dtype: object

    另外一点也很像列表,就是里面的元素的类型,由你任意决定(其实是由需要来决定)。

    这里,我们实质上创建了一个 Series 对象,这个对象当然就有其属性和方法了。比如,下面的两个属性依次可以显示 Series 对象的数据值和索引:

    In [5]: s.index
    Out[5]: RangeIndex(start=0, stop=4, step=1)

    In [8]: s.values
    Out[8]: array([1, 4, 'ww', 'tt'], dtype=object)

    列表的索引只能是从 0 开始的整数,Series 数据类型在默认情况下,其索引也是如此。不过,区别于列表的是,Series 可以自定义索引

    In [9]: s2 = Series(['wangxing','man',24],index=['name','sex','age'])

    In [10]: s2
    Out[10]:
    name    wangxing
    sex       man
    age      24
    dtype: object

    每个元素都有了索引,就可以根据索引操作元素了。还记得 list 中的操作吗?Series 中,也有类似的操作。先看简单的,根据索引查看其值和修改其值

    In [12]: s2['name']
    Out[12]: 'wangxing'

    In [45]: s2['name'] = 'wudadiao'

    In [46]: s2
    Out[46]:
    name    wudadiao
    sex    man
    age   24
    dtype: object

    这是不是又有点类似 dict 数据了呢?的确如此。看下面就理解了。

    读者是否注意到,前面定义 Series 对象的时候,用的是列表,即 Series() 方法的参数中,第一个列表就是其数据值,如果需要定义 index,放在后面,依然是一个列表。除了这种方法之外,还可以用下面的方法定义 Series 对象:

    In [13]: sd = {'python':9000,'c++':9001,'c#':9000}

    In [14]: s3 = Series(sd)

    In [15]: s3
    Out[15]:
    c#    9000
    c++    9001
    python   9000
    dtype: int64

    现在是否理解为什么前面那个类似 dict 了?因为本来就是可以这样定义的

    这时候,索引依然可以自定义。Pandas 的优势在这里体现出来,如果自定义了索引,自定的索引会自动寻找原来的索引,如果一样的,就取原来索引对应的值,这个可以简称为“自动对齐”。

    In [16]: s4 = Series(sd,index=['java','c++','c#'])

    In [17]: s4
    Out[17]:
    java    NaN
    c++    9001.0
    c#    9000.0
    dtype: float64

    在 Pandas 中,如果没有值,都对齐赋给 NaN。

    Pandas 有专门的方法来判断值是否为空。

    In [19]: pd.isnull(s4)
    Out[19]:
    java    True
    c++   False
    c#    False
    dtype: bool

    此外,Series 对象也有同样的方法:

    In [20]: s4.isnull()
    Out[20]:
    java    True
    c++   False
    c#    False
    dtype: bool

    其实,对索引的名字,是可以从新定义的:

    In [21]: s4.index = ['语文','数学','English']

    In [22]: s4
    Out[22]:
    语文    NaN
    数学   9001.0
    English    9000.0
    dtype: float64

    对于 Series 数据,也可以做类似下面的运算(关于运算,后面还要详细介绍):

    In [23]: s4 * 2
    Out[23]:
    语文    NaN
    数学    18002.0
    English    18000.0
    dtype: float64

    In [24]: s4[s4 > 9000]
    Out[24]:
    数学 9001.0
    dtype: float64

    Series就先简要写到这,下面看pandas的另一种数据结构DataFrame.

    DataFrame

    DataFrame 是一种二维的数据结构,非常接近于电子表格或者类似 mysql 数据库的形式。它的竖行称之为 columns,横行跟前面的 Series 一样,称之为 index,也就是说可以通过 columns 和 index 来确定一个主句的位置。

    首先来导入模块

    In [27]: from pandas import Series,DataFrame

    In [26]: data = {"name":['google','baidu','yahoo'],"marks":[100,200,300],"price":[1,2,3]}

    In [28]: f1 = DataFrame(data)

    In [29]: f1
    Out[29]:
      marks   name    price
    0    100    google    1
    1    200    baidu    2
    2   300    yahoo    3

    这是定义一个 DataFrame 对象的常用方法——使用 dict 定义。字典的“键”("name","marks","price")就是 DataFrame 的 columns 的值(名称),字典中每个“键”的“值”是一个列表,它们就是那一竖列中的具体填充数据。上面的定义中没有确定索引,所以,按照惯例(Series 中已经形成的惯例)就是从 0 开始的整数。从上面的结果中很明显表示出来,这就是一个二维的数据结构(类似 excel 或者 mysql 中的查看效果)。

    上面的数据显示中,columns 的顺序没有规定,就如同字典中键的顺序一样,但是在 DataFrame 中,columns 跟字典键相比,有一个明显不同,就是其顺序可以被规定,向下面这样做:

    In [31]: f2 = DataFrame(data,columns=['name','price','marks'])

    In [32]: f2
    Out[32]:
      name    price    marks
    0  google   1        100
    1  baidu    2         200
    2  yahoo   3         300

    跟 Series 类似的,DataFrame 数据的索引也能够自定义

    In [35]: f3 = DataFrame(data,columns=['name','marks','price'],index=['a','b','c'])

    In [36]: f3
    Out[36]:
      name    marks    price
    a   google      100        1
    b     baidu          200       2
    c     yahoo         300            3

    定义 DataFrame 的方法,除了上面的之外,还可以使用“字典套字典”的方式。

    In [40]: newdata = {'lang':{'first':'python','second':'java'},'price':{'first':5000,'second':2000}}

    In [41]: f4 = DataFrame(newdata)

    In [42]: f4
    Out[42]:
        lang    price
    first   python   5000
    second   java    2000

    在字典中就规定好数列名称(第一层键)和每横行索引(第二层字典键)以及对应的数据(第二层字典值),也就是在字典中规定好了每个数据格子中的数据,没有规定的都是空。

    DataFrame 对象的 columns 属性,能够显示素有的 columns 名称。并且,还能用下面类似字典的方式,得到某竖列的全部内容(当然包含索引):
    >>> newdata = {"lang":{"firstline":"python","secondline":"java"}, "price":{"firstline":8000}} 
    >>> f4 = DataFrame(newdata) 
    >>> f4 
                  lang     price 
    firstline     python   8000 
    secondline    java     NaN 
    >>> DataFrame(newdata, index=["firstline","secondline","thirdline"]) 
                  lang     price 
    firstline     python   8000 
    secondline    java     NaN 
    thirdline     NaN      NaN 
    
    DataFrame 对象的 columns 属性,能够显示素有的 columns 名称。并且,还能用下面类似字典的方式,得到某竖列的全部内容(当然包含索引):
    

    In [44]: f3['name']
    Out[44]:
    a google
    b baidu
    c yahoo
    Name: name, dtype: object

    下面操作是给同一列赋值

    newdata1 = {'username':{'first':'wangxing','second':'dadiao'},'age':{'first':24,'second':25}}

    In [67]: f6 = DataFrame(newdata1,columns=['username','age','sex'])

    In [68]: f6
    Out[68]:
      username    age    sex
    first wangxing    24    NaN
    second dadiao   25    NaN

    In [69]: f6['sex'] = 'man'

    In [70]: f6
    Out[70]:
      username  age    sex
    first wangxing   24    man
    second dadiao   25    man

    可以单独的赋值,除了能够统一赋值之外,还能够“点对点”添加数值,结合前面的 Series,既然 DataFrame 对象的每竖列都是一个 Series 对象,那么可以先定义一个 Series 对象,然后把它放到 DataFrame 对象中。如下:

    ssex = Series(['男','女'],index=['first','second'])

    In [72]: f6['sex'] = ssex

    In [73]: f6
    Out[73]:
      username    age   sex
    first wangxing     24      男
    second dadiao    25    女

    还可以更精准的修改数据吗?当然可以,完全仿照字典的操作:

    In [74]: f6['age']['second'] = 30

    In [75]: f6
    Out[75]:
      username    age    sex
    first wangxing    24          男
    second dadiao   30     女

    参考http://wiki.jikexueyuan.com/project/start-learning-python/312.html所整理。

    展开全文
  • Python Pandas 合并联接——Merge

    千次阅读 2019-07-30 15:15:11
    Python Pandas 合并联接——Merge 文章目录Python Pandas 合并联接——Merge1. Pandas 安装2. Pandas 的数据操作使用pandas前需要先引入pandas,若无特别说明,pd作为Pandas别名的通用写法2.1 作用2.2 参数说明2.3 ...

    Python Pandas 合并联接——Merge

    Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。

    1. Pandas 安装

    官方推荐的安装方式是通过Anaconda安装,但Anaconda太过庞大,若只是需要Pandas的功能,则可通过PyPi方式安装。

    pip install Pandas
    

    2. Pandas 的数据操作

    使用pandas前需要先引入pandas,若无特别说明,pd作为Pandas别名的通用写法

    import pandas as pd   
    

    2.1 作用

    • 通过一个或多个键将两个数据集的行连接起来,类似与SQL的join。
    • 典型场景:两张包含不同字段的表,但有一个共同的主键,可利用merge将其横向整合到一张表
    def merge(
            self,
            right,
            how="inner",
            on=None,
            left_on=None,
            right_on=None,
            left_index=False,
            right_index=False,
            sort=False,
            suffixes=("_x", "_y"),
            copy=True,
            indicator=False,
            validate=None,
        ):
    

    2.2 参数说明

    • self(有时也是left):DataFrame或Series对象的名称

    • right:另一个DataFrame或Series对象的名称

    • how:确定连接主键的方式,默认为inner

      Merge 方式 对应SQL的功能 描述
      left LEFT OUTER JOIN 仅使用左边DataFrame中的主键
      right RIGHT OUTER JOIN 仅使用右边DataFrame中的主键
      outer FULL OUTER JOIN 使用左右两边DataFrame中主键的并集
      inner INNER JOIN 使用左右两边DataFrame中主键的交集
    • on:用于显式指定列名(键名),如果该列在两个对象中的列名不一样,则可以通过left_on=None, right_on=None 来分别指定。或者想直接使用行索引作为连接键的话,就将 left_index=False, right_index=False 设为 True

    • left_on:左侧DataFrame或Series中的列或索引用作键。可以是列名,索引名称,也可以是长度等于DataFrame或Series长度的数组。

    • right_on:来自右侧DataFrame或Series的列或索引用作键。可以是列名,索引名称,也可以是长度等于DataFrame或Series长度的数组

    • left_index:If True,使用左侧DataFrame或Series中的索引(行标签)作为其连接键。对于具有MultiIndex(分层)的DataFrame或Series,级别数必须与右侧DataFrame或Series中的连接键数相匹配。

    • right_index:与left_index右侧DataFrame或Series 相同的用法

    • sort:按字典顺序通过连接键对结果DataFrame进行排序。默认为True,设置为False在很多情况下会显著提高性能

    • suffixes:要应用于重叠列的字符串后缀元组。默认为('_x', '_y')

    • copy:始终为True,从传递的DataFrame或Series对象复制数据(默认),即使不需要重建索引也是如此。

    • indicator:向输出的DataFrame添加一列,其中_merge 包含有关每行源的信息。_merge是分类类型,并且left_only对于其合并键仅出现在'left'DataFrame或Series中right_only的观察值,对于其合并键仅出现在DataFrame或Series中的观察值'right',以及both在两者中都找到观察的合并键的观察值。

    • validate:string,默认无。如果指定,则检查merge是否为指定类型。

      • “one_to_one”或“1:1”:检查合并键是否在左右数据集中都是唯一的。
      • “one_to_many”或“1:m”:检查合并键是否在左数据集中是唯一的。
      • “many_to_one”或“m:1”:检查合并键是否在右侧数据集中是唯一的。
      • “many_to_many”或“m:m”:允许,但不会导致检查。

    2.3 单主键实例说明

    left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']})
    right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']})
    result = pd.merge(left, right, on='key')  # 当key确定明显时,可不指定on参数
    

    在这里插入图片描述

    2.4 多主键实例说明

    left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                         'key2': ['K0', 'K1', 'K0', 'K1'],
                         'A': ['A0', 'A1', 'A2', 'A3'],
                         'B': ['B0', 'B1', 'B2', 'B3']})
    right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                          'key2': ['K0', 'K0', 'K0', 'K0'],
                          'C': ['C0', 'C1', 'C2', 'C3'],
                          'D': ['D0', 'D1', 'D2', 'D3']})
    
    result = pd.merge(left, right, how='left', on=['key1', 'key2'])
    

    在这里插入图片描述

    Tips:

    how=‘left’

    以左边主键为标准,在右边寻找相同的主键的一行与左边的行合并作为新的行

    result = pd.merge(left, right, how='right', on=['key1', 'key2'])
    

    在这里插入图片描述

    Tips:

    how=‘right’

    以右边主键为标准,在左边边寻找相同的主键的一行与右边的行合并作为新的行

    result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
    

    在这里插入图片描述

    Tips:

    how=‘outer’

    以左右两边主键并集为标准,寻找对应行,作为新行,若出现没有元素的地方,以NaN填充

    result = pd.merge(left, right, how='inner', on=['key1', 'key2'])
    

    在这里插入图片描述

    Tips:

    how=‘inner’

    以左右两边主键交集为标准,寻找对应行,作为新行

    2.5 未作为合并参考主键的列名出现重复

    left = pd.DataFrame({'A': [1, 2], 'B': [2, 2]})
    right = pd.DataFrame({'A': [4, 5, 6], 'B': [2, 2, 2]})
    result = pd.merge(left, right, on='B', how='outer')
    

    在这里插入图片描述

    默认在重复列名后添加后缀’_x’,’_y’作为新的列名,此后缀可通过suffixes参数进行设置

    Warring:

    在重复键上加入/合并可能导致返回的帧是行维度的乘法,这可能导致内存溢出。在加入大型DataFrame之前,用户有责任管理密钥中的重复值

    为了避免合并键中出现意外的重复,需要在合并操作之前检查密钥唯一性,防止内存溢出,可设置validate参数

    left = pd.DataFrame({'A' : [1,2], 'B' : [1, 2]})
    right = pd.DataFrame({'A' : [4,5,6], 'B': [2, 2, 2]})
    result = pd.merge(left, right, on='B', how='outer', validate="one_to_one")
    

    此时会出现MergeError: Merge keys are not unique in right dataset; not a one-to-one merge

    原因是参数中设置了validate参数为“one-to-one”,即检查合并键是否在左右数据集中都是唯一的,但在右边数据集中,合并键中出现了重复。但此时左边数据集合并键中没有重复,可设置为validate="one_to_many,或者为validate="many_to_many,设置为many_to_many将不会检查合并键数据集的唯一性。

    2.6 提示合并详情

    设置indicator 为True(默认为False),将在合并后的数据集中添加一列,列名为“_merge”,数据集提示数据的来源,有以下三种结果

    _merge 值 含义
    left_only 该行数据全只来自于左边数据集
    right_only 该行数据全只来自于右边数据集
    both 该行数据来自于左右两边数据集

    indicator 也可输入字符串,若如此,视为indicator 的值已经设为True,且设置添加的提示列的列名为输入字符串

    参考

    [Pnadas用户指南] https://www.pypandas.cn/docs/user_guide/merging.html

    展开全文
  • 学习《Python3爬虫、数据清洗与可视化实战》时自己的一些实践。 缺失值处理 Pandas数据对象中的缺失值表示为NaN。 import pandas as pd # 读取杭州天气文件 df = pd.read_csv("E:/Data/practice/hz_weather....

    学习《Python3爬虫、数据清洗与可视化实战》时自己的一些实践。


    缺失值处理

    Pandas数据对象中的缺失值表示为NaN。

    import pandas as pd
    
    # 读取杭州天气文件
    df = pd.read_csv("E:/Data/practice/hz_weather.csv")
    
    # 数据透视表
    df1 = pd.pivot_table(df, index=['天气'], columns=['风向'], values=['最高气温'])
    
    # 用isnull()获得缺失值位置为True,非缺失值位置为False的DataFrame
    lack = df1.isnull()
    # print(lack)
    

    在这里插入图片描述

    # 再调用any()就可以看到哪些列有缺失值
    lack_col = lack.any()
    # print(lack_col)  # 可以看到只有北风这一列完全没有缺失值
    

    在这里插入图片描述

    # 只显示存在缺失值的行列
    df1_lack_only = df1[df1.isnull().values == True]
    # print(df1_lack_only)
    

    在这里插入图片描述

    # 删除缺失的行
    df1_del_lack_row = df1.dropna(axis=0)
    # print(df1_del_lack_row)
    

    在这里插入图片描述

    # 删除缺失的列(一般不因为某列有缺失值就删除列, 因为列常代表某指标)
    df1_del_lack_col = df1.dropna(axis=1)
    # print(df1_del_lack_col)  # 只剩下北风
    

    在这里插入图片描述

    # 使用字符串代替缺失值
    df1_fill_lcak1 = df1.fillna('missing')
    # print(df1_fill_lcak1)
    

    在这里插入图片描述

    # 使用前一个数据(同列的上一个数据)替代缺失值,第一行的缺失值没法找到替代值
    df1_fill_lack2 = df1.fillna(method='pad')
    # print(df1_fill_lack2)
    

    在这里插入图片描述

    # 使用后一个数据(同列的下一个数据)替代缺失值,最后一行的缺失值没法找到替代值
    # 参数limit=1限制每列最多只能替代掉一个NaN
    df1_fill_lack3 = df1.fillna(method='bfill', limit=1)
    # print(df1_fill_lack3)
    

    在这里插入图片描述

    # df对象的mean()方法会求每一列的平均值,也就是每个指标的平均值.下面使用平均数代替NaN
    df1_fill_lack4 = df1.fillna(df1.mean())
    # print(df1_fill_lack4)
    

    在这里插入图片描述

    基于数据分布检测异常值

    假设"最低气温"是符合正态分布的,那么就可以根据3σ3 \sigma原则,认为落在[3σ+μ,+3σ+μ][-3 \sigma + \mu , +3\sigma + \mu ]之外的值是异常值。

    # %matplotlib inline
    import matplotlib.pyplot as plt
    import pandas as pd
    
    # 读取杭州天气数据
    df = pd.read_csv("E:/Data/practice/hz_weather.csv")
    
    # 创建图的布局,位于1行1列,宽度为8,高度为5,这两个指标*dpi=像素值,dpi默认为80(保存图像时为100)
    # 返回的fig是绘图窗口,ax是坐标系
    fig, ax = plt.subplots(1, 1, figsize=(8, 5))
    # hist函数绘制柱状图,第一个参数传入数值序列(这里是Series),这里即是最低气温.bins指定有多少个柱子
    ax.hist(df['最低气温'], bins=20)
    # 显示图
    plt.show()
    
    # 取最低气温一列,得到的是Series对象
    s = df['最低气温']
    # 计算到miu的距离(还没取绝对值)
    zscore = s - s.mean()
    # 标准差sigma
    sigma = s.std()
    # 添加一列,记录是否是异常值,如果>3倍sigma就认为是异常值
    df['isOutlier'] = zscore.abs() > 3 * sigma
    # 计算异常值数目,也就是这一列中值为True的数目
    print(df['isOutlier'].value_counts())
    

    运行结果:
    在这里插入图片描述

    根据四分位数作箱型图和检测异常值

    这里将大于上四分位数(Q3)的上海成交量数据认为是异常值,关于这个指标见这里。关于使用过程中出现的赋值警告见这里

    # %matplotlib inline
    import pandas as pd
    import matplotlib.pyplot as plt
    
    # 符合格式的txt文件也可以直接当csv文件读入
    df = pd.read_csv('E:/Data/practice/sale_data.txt')
    # 创建图布局
    fig, ax = plt.subplots(1, 1, figsize=(8, 5))
    # 取上海数据
    df_ = df[df['位置'] == '上海']
    # 函数boxplot用于绘制箱型图,绘制的指标是'成交量',坐标用前面matplotlib创建的坐标系
    df_.boxplot(column='成交量', ax=ax)
    plt.show()
    
    # 查看上海的成交量情况,这里即提取为Series对象
    s = df_['成交量']
    print(s.describe())
    
    # 这里规避A value is trying to be set on a copy of a slice from a DataFrame
    df_ = df_.copy()
    # 这里将大于上四分位数(Q3)的设定为异常值
    # df_['isOutlier'] = s > s.quantile(0.75)
    df_.loc[:, 'isOutlier'] = s > s.quantile(0.75)
    # 查看上海成交量异常的数据
    df_rst = df_[df_['isOutlier'] == True]
    print(df_rst)
    

    在这里插入图片描述
    在这里插入图片描述

    重复值处理

    基本就两个函数,duplicated()返回bool的Series序列表示是不是重复值;而drop_duplicates()直接对重复数据(行)进行删除,返回DataFrame。

    import pandas as pd
    
    # 读取杭州天气数据
    df = pd.read_csv('E:/Data/practice/hz_weather.csv')
    # 检测重复行,生成bool的DF
    s_isdup = df.duplicated()
    # print(s_isdup)
    print(s_isdup.value_counts())  # 全是False
    

    在这里插入图片描述

    # 检测最高气温重复的行
    s_isdup_zgqw = df.duplicated('最高气温')
    print(s_isdup_zgqw.value_counts())
    

    在这里插入图片描述

    # 去除'最高气温'重复的行
    df_dup_zgqw = df.drop_duplicates('最高气温')
    # print(df_dup_zgqw)
    

    在这里插入图片描述

    旅游数据的值检查与处理

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_csv("E:/Data/practice/qunar_free_trip.csv")
    # 查看数据的组织结构
    # print(df.head())
    

    在这里插入图片描述

    # 查看数据信息,从中可以看到没有缺失值(全是non-null)
    print(df.info())
    

    在这里插入图片描述

    # 查看重复值,先转成bool的Series再用值的统计函数查看
    print(df.duplicated().value_counts())
    

    在这里插入图片描述

    # 移除重复值,然后再确认一下
    df = df.drop_duplicates()
    print(df.duplicated().value_counts())
    

    在这里插入图片描述

    # 查看描述性统计信息
    print(df.describe())
    

    在这里插入图片描述

    # 绘制价格分布的直方图/箱型图
    # 注意这里的细节,一行两列2个图,所以会返回两个坐标系,这里在变量ax->axes上体现了出来
    fig, axes = plt.subplots(1, 2, figsize=(12, 5))
    # 第一个坐标系上绘制直方图
    axes[0].hist(df['价格'], bins=20)
    # 第二个坐标系上绘制箱型图
    df.boxplot(column='价格', ax=axes[1])
    # 自动调整绘图区的大小及间距,使所有的绘图区及其标题、坐标轴标签等都可以不重叠的完整显示在画布上
    fig.tight_layout()
    plt.show()
    

    在这里插入图片描述

    # 用均方差法找出价格异常值,标准差能反映一个数据集的离散程度
    s = df['价格']
    # 序列中的价格和平均价格的差距
    zscore = s - s.mean()
    # 这里用3.5倍sigma
    df['isOutlier'] = zscore.abs() > 3.5 * s.std()
    # 输出异常的样本
    df_out = df[df['isOutlier'] == True]
    # print(df_out)
    

    在这里插入图片描述

    展开全文
  • 测验1:Python基本语法元素 知识点概要: 普遍认为Python语言诞生于1991年 Python语言中的缩进在程序中长度统一且强制使用,只要统一即可,不一定是4个空格(尽管这是惯例) IPO模型指:Input Process Output ...
  • file_name=r'C:\Users\23263\Desktop\test.csv' mydf=pd.read_csv(file_name) 现在我们假装打开了一个dataframe类型并赋值为mydf 方法一:mydf.at[i,'经度'] # i 为行数 方法二:mydf['经度'][i] # i 为行数 ...
  • Python--Pandas-数据可视化

    万次阅读 多人点赞 2018-06-08 23:04:37
    我们做数据可视化,其实就是就数据进行分析,使用Python做数据分析的,我想pandas必然是一个利器,一个非常强大的数据分析工具包,也集成了数据可视化的功能,一个集数据处理、分析、可视化于一身的工具,非常强大...
  • Pythonpandas模块

    2019-07-01 14:59:31
    文章目录1 Pandas简介2 Pandas安装3 Pandas使用3.1 导入3.2 Series3.3 DataFrame 1 Pandas简介 1、Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas ...
  • 本篇文章是介绍的一个小作业,利用python对excel中的数据进行处理。这里数据就不公开了。本篇文章有两个目的,一是作为学习记录,二是希望对大家有点帮助,对于不足之处,也希望各路大佬可以不吝赐教。本文为作者...
  • 我们可以使用行和列标签访问 ...import pandas as pd # 创建一个字典列表 items2 = [{'bikes': 20, 'pants': 30, 'watches': 35}, {'watches': 10, 'glasses': 50, 'bikes': 15, 'pants':5}] # 创建一个Data...
  • df:任意的Pandas DataFrame对象 s:任意的Pandas Series对象 raw:行标签 col:列标签 引入响应模块: import pandas as pd import numpy as np 导入数据 pd.read_csv(filename_path):从CSV文件导入数据 pd....
  • 题目:寻找峰值 峰值元素是指其值大于左右相邻值的元素。 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。 数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。 你...
  • Python Pandas找到缺失值的位置

    万次阅读 多人点赞 2016-09-18 17:48:16
    python pandas判断缺失值一般采用 isnull(),然而生成的却是所有数据的true/false矩阵,对于庞大的数据dataframe,很难一眼看出来哪个数据缺失,一共有多少个缺失数据,缺失数据的位置。首先对于存在缺失值的数据...
  • 1、axis (合并方向) ,ignore_index ...import pandas as pd import numpy as np #定义资料集 df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d']) df2 = pd.DataFrame(np.ones((3,4))*1, columns=['...
  • 我找了很久,也尝试了很多办法,都没能找到一种非常直接的函数,本文所要介绍的是一种我认为比较方便的方法:np.where()我举个例子import pandas as pd import numpy as npdf = pd.DataFrame(np.arange(12)....
  • pandas 是基于NumPy 的一种工具, 名字很卡哇伊,来源是由“ Panel data”(面板数据,一个计量经济学名词)两个单词拼成的。pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。主要...
  • How to find Missing values in a data frame using Python/Pandas 如何使用Python / Pandas查找数据框中的缺失值 介绍: (Introduction:) When you start working on any data science project the data you are ...
  • Python: pandas中ix的详细讲解

    万次阅读 多人点赞 2018-09-21 16:52:05
    在上一篇博客中,我们已经仔细讲解了iloc和loc,只是简单了提到了ix。这是因为相比于前2者,ix更复杂,也更让人迷惑。 因此,本篇博客通过例子的解释试图来描述清楚ix,尤其是与iloc和loc的联系。...
  • pandas虽然有两种数据结构,因为他是Python的一个库,所以Python的数据类型在这里依然适用,同样还可以使用类自己定义数据类型。Pandas里面又定义了两种数据类型:Series和DataFrame基本的导入方式:fro...
  • import pandas as pd text = pd.DataFrame([[21,45,78],[23,56,89],[14,25,36],[47,58,69]]) # 先建立一个矩阵 print(text) Out[1]: 0 1 2 0 21 45 78 1 23 56 89 2 14 25 36 3 47 58 69 # 找到最大值和...
1 2 3 4 5 ... 20
收藏数 7,116
精华内容 2,846
关键字:

pandas python 寻找