Pandas数据处理总结 (手册3.1-3.2)

Pandas数据处理总结 (手册3.1-3.2)

  • 在NumPy和它的ndarray对象中, 为多维数组提供了高效的存储和处理方法.。
  • Pandas是在NumPy基础上建立的新程序库,提供了高效的DataFrame数据结构。
  • DataFrame本质上是一种带行标签列标签、支持相同类型数据缺失值多维数组。此外,还有Seriesindex

注:转载请注明出处


Pandas安装(3.1)

Pandas的导入形式与NumPy相同。
检测Pandas版本号

import pandas as pd
import numpy as np
print(pd.__version__,np.__version__)    # 注:是version不是vision
1.1.0 1.19.1

Pandas对象介绍(3.2)

Pandas三个基础数据结构 : Series, DataFrame, Index (注意字母大小写)。

Pandas的 Series对象(3.2.1)

· 基本操作
  • Series是一个带索引数据的一维数组。可以用一个数组创建。
# 可以用一个数组创建Series对象
data1 = pd.Series([0.25,0.5,0.75,1])
data2 = np.array([0.25,0.5,0.75,1])
data3 = [0.25,0.5,0.75,1]
print("data1的数据类型是:\n",type(data1),'---\n',data1)
print("data2的数据类型是:\n",type(data2),'---\n',data2)
print("data3的数据类型是:\n",type(data3),'---\n',data3)
data1的数据类型是:
 <class 'pandas.core.series.Series'> ---
 0    0.25
1    0.50
2    0.75
3    1.00
dtype: float64
data2的数据类型是:
 <class 'numpy.ndarray'> ---
 [0.25 0.5  0.75 1.  ]
data3的数据类型是:
 <class 'list'> ---
 [0.25, 0.5, 0.75, 1]

Series对象将一组数据和一组索引绑定在一起,可以通过values属性index属性来获取数据。

  • values属性返回的结果与NumPy数组类似(注意字母大小写和是否为复数格式):
data1.values
array([0.25, 0.5 , 0.75, 1.  ])
  • index属性返回的结果是类型为pd.Index的类数组对象:
data1.index
RangeIndex(start=0, stop=4, step=1)
· 索引取值
  • 可以通过中括号索引标签获取值:
data1[2]  # 第3个数值
0.75
data1[1:3]  # 第2-3个  ,左闭右开
1    0.50
2    0.75
dtype: float64
data[:3]   # 前3个
a    0.25
a     0.5
c    0.75
dtype: object
(1) Series vs NumPy数组

Series和NumPy的一维数组基本相同, 本质差别在索引上。
NumPy数组是隐式定义整数索引获取数值,而Pandas的Series对象用一种显示定义的索引与数值关联。

  • 显示索引 : 索引不仅仅是整数, 还可以是任何想要的类型
data = pd.Series([0.25,0.5,0.75,1,'nihao'],index=['a','a','c','d',100])
data
a       0.25
a        0.5
c       0.75
d          1
100    nihao
dtype: object
  • 注意点
  1. Series数组中索引和数值都可以是不同类型的。而NumPy中数组类型必须是同类型的。
  2. Series数组中索引值可以相同。
(2) Series vs 字典
  • 可以把Pandas的Series对象看成是一种特殊的Python字典。
  • 类比NumPy的数组比Python列表高效。
    Pandas Series对象在某些操作上比Python的字典高效。

用Python的字典创建一个Series对象。用字典创建Series对象时,其索引默认按照顺序排列。

rk_dict = {'湖北':23213,
             '湖南':213323,     # 用冒号 而不是逗号
             '广东':233232,
             '江西':8238238,
             '山东':992329}
rk = pd.Series(rk_dict)
rk
湖北      23213
湖南     213323
广东     233232
江西    8238238
山东     992329
dtype: int64
rk['湖北']
23213
  • 和字典不同, Series对象还支持数组形式的操作,如切片。也就是说:
    (1)Series不是字典
    (2)字典不能执行数组形式的操作,会报错
rk['湖北':'广东']
湖北     23213
湖南    213323
广东    233232
dtype: int64
(3) 创建Series对象

创建Series对象的方法大都为如下形式:

  • pd.Series(data, index=index)
  • index是一个可选参数, data参数支持多种数据类型

1)data 可以是列表NumPy数组, 这时 index 默认值整数序列:

pd.Series([2,4,6,8])
0    2
1    4
2    6
3    8
dtype: int64

2)data 也可以是标量

pd.Series(5,index=[100,200,300])
100    5
200    5
300    5
dtype: int64

3)data 还可以是字典index默认是排序的字典键:

pd.Series({2:'a',3:'b',4:'d'})
2    a
3    b
4    d
dtype: object

4)上述的形式都可以通过显式指定索引筛选出需要的结果:

pd.Series({2:'a',3:'b',4:'d'},index=[4,2])
4    d
2    a
dtype: object

Pandas的DataFrame对象(3.2.2)

可以将Series类比为灵活的索引的一维数组,那么DataFrame就可以看作一个既有灵活行索引,又有灵活列名二维数组。

(1)DataFrame是通用型数组
rk_dict = {'湖北':23213,
           '湖南':213323,     # 用冒号 而不是逗号
           '广东':233232,
           '江西':8238238,
           '山东':992329}
rk = pd.Series(rk_dict)

sh_dict = {'湖北':'武汉',
           '湖南':'长沙',     
           '广东':'广州',
           '江西':'南昌',
           '山东':'济南'}
sh = pd.Series(sh_dict)
print(rk)
print(sh)
湖北      23213
湖南     213323
广东     233232
江西    8238238
山东     992329
dtype: int64
湖北    武汉
湖南    长沙
广东    广州
江西    南昌
山东    济南
dtype: object
  • 用上面的两个Series对象定义一个DataFrame:
states = pd.DataFrame({'省会':sh,
                       '人口':rk})
states
省会人口
湖北武汉23213
湖南长沙213323
广东广州233232
江西南昌8238238
山东济南992329
  • 和Series一样,DataFrame也有index属性可以获取获取索引标签
states.index
Index(['湖北', '湖南', '广东', '江西', '山东'], dtype='object')
  • DataFrame有columns属性,存放列标签Index对象。注意复数和字母大小写:
states.columns
Index(['省会', '人口'], dtype='object')

DataFrame的特点是列也有索引,所以数据可以通过行/列索引获得。

(2)DataFrame是特殊的字典

字典是一个键映射一个值, DataFrame是一列映射一个Series的数据. 也就是索引列标签的话, 返回一列数据,而行索引会报错。

print(states['省会'])  # 为什么结果把行索引也都带出了呢 ?
# print(states['湖北'])  报错
湖北    武汉
湖南    长沙
广东    广州
江西    南昌
山东    济南
Name: 省会, dtype: object
(3)创建DataFrame对象
方式1 : 通过单个Series对象创建
pd.DataFrame(rk,columns=['人口'])
# rk是个Series对象,没有列标签. DataFrame是有列标签的, 所以需要指定.
# 人口需要用中括号[],不能用小括号
人口
湖北23213
湖南213323
广东233232
江西8238238
山东992329
方式2 : 通过字典创建(应该是用字典,列表创建)
data = [{'a': i, 'b': 2*i} for i in range(3)] 
print(data)
print(type(data))
# 这是创建了一个list, list里面有三个字典类型的元素
data1 = pd.DataFrame(data)
print(data1)
[{'a': 0, 'b': 0}, {'a': 1, 'b': 2}, {'a': 2, 'b': 4}]
<class 'list'>
   a  b
0  0  0
1  1  2
2  2  4

从上代码可以看出, 当用字典创建DataFrame的时候, 原字典的关键字变成了DataFrame中的列(columns)

pd.DataFrame([{'a':1,'b':100},{'b':1000,'a':12},{'b':123,'c':"湖北"},{'a':1000}])
abc
01.0100.0NaN
112.01000.0NaN
2NaN123.0湖北
31000.0NaNNaN
x1 = {'a':1,'b':100,'a':100}      # 两个a, 居然不报错,但是输出的结果中a只有一个
x1
{'a': 100, 'b': 100}
方式3 : 通过Series创建
rk_dict = {'湖北':23213,
             '湖南':213323,     # 用冒号 而不是逗号
             '广东':233232,
             '江西':8238238,
             '山东':992329}     #注意 山东在 sh中没有
rk = pd.Series(rk_dict)

sh_dict = {'湖北':'武汉',
           '湖南':'长沙',     
             '广东':'广州',
             '江西':'南昌',
             '广西':'南宁'}      #注意广西在rk中没有
sh = pd.Series(sh_dict)
pd.DataFrame({'人口':rk,'省会':sh})
人口省会
山东992329.0NaN
广东233232.0广州
广西NaN南宁
江西8238238.0南昌
湖北23213.0武汉
湖南213323.0长沙
方式4 : 通过NumPy二维数组创建
pd.DataFrame(np.random.rand(3,2),columns=['x1','x2'],index = ['a','b','c'])
x1x2
a0.6472560.841571
b0.6875230.205214
c0.7078210.498514
方式5 : 通过NumPy结构化数组创建。在2.9节中介绍
A = np.zeros(3,dtype=[('a','i8'),('b','f8')])
print(A)
print(type(A))
A
[(0, 0.) (0, 0.) (0, 0.)]
<class 'numpy.ndarray'>





array([(0, 0.), (0, 0.), (0, 0.)], dtype=[('a', '<i8'), ('b', '<f8')])
pd.DataFrame(A)     #  无缝连接?
ab
000.0
100.0
200.0

Pandas的Index对象(3.2.3)

(1) 看作是不可变数组

Index对象可像数组一样通过Python的取值方式获取数值,也可通过切片取值。

ind[3]
7
ind[:3]
Int64Index([2, 3, 4], dtype='int64')

Index对象还有与NumPy数组相似的属性值。如.size, .shape, .ndim, .dtype等。

print(ind.size, ind.shape, ind.ndim, ind.dtype)
5 (5,) 1 int64

Index对象与NumPy数组的不同之处在于:Index对象的索引是不可变的,如利用索引修改值时会报错。Index对象的不可变特征便使得多个DataFrame和数组之间进行索引共享时更加安全

ind[1] = 0
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-133-906a9fa1424c> in <module>
----> 1 ind[1] = 0


d:\python\lib\site-packages\pandas\core\indexes\base.py in __setitem__(self, key, value)
   4073 
   4074     def __setitem__(self, key, value):
-> 4075         raise TypeError("Index does not support mutable operations")
   4076 
   4077     def __getitem__(self, key):


TypeError: Index does not support mutable operations
(2) 看作是有序集合

Index对象遵循Python标准库的集合(set)数据结构的许多用法,包括并集&交集|差集^等。

inda = pd.Index([1,3,5,7,9])
indb = pd.Index([2,4,5,9,10])
print(inda & indb)   # 交集
print(inda | indb)  #并集
print(inda ^ indb)   # 异或、

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值