Pandas笔记

Pandas基础

Pandas中的常用数据对象

  • 常用的数据对象有Series,DataFrame,Panel
  • Series对应一维数据,DataFrame对应二维数据,Panel对应三维数据或者可变维度数据
Series对象
  • 创建Series对象
g=np.array([27466.15,24899.3,19610.9,19492.4,17885.39,17558.76,15475.09,12170.2]) # 该数组从数据结构的角度来说,数组的索引缺乏明确的意义
gdp=pd.Series(g,index=['shanghai','beijing','guangzhou','shenzhen','tianjin','chongqing','suzhou','chengdu']) 
# 创建Series对象来解决索引意义不明确的问题
gdp
>>>
shanghai     27466.15
beijing      24899.30
guangzhou    19610.90
shenzhen     19492.40
tianjin      17885.39
chongqing    17558.76
suzhou       15475.09
chengdu      12170.20
dtype: float64
============================================================
g2=pd.Series(g) # index参数是标签索引,如果不设置则默认是从0开始的索引
g2
>>> 
0    27466.15
1    24899.30
2    19610.90
3    19492.40
4    17885.39
5    17558.76
6    15475.09
7    12170.20
dtype: float64

  • pd.Series(['data=None','index=None','dtype=None','name=None', 'copy=False', 'fastpath=False'],)这是创建Series对象的函数,其中data参数可以传入ndarray、列表、字典、数字、字符串。
pd.Series(data=[100,200,300])
>>>
0    100
1    200
2    300
dtype: int64

============================================================
pd.Series(100,index=['a','b','c'])  # data参数传数字跟字符串效果一样
>>>
a    100
b    100
c    100
dtype: int64

============================================================
pd.Series('faker',index=[3,4,5])  # 标签参数如果传入整数列表,则用该标签索引代替位置索引,也就是说此时位置索引无法使用了
>>>
3    faker
4    faker
5    faker
dtype: object

============================================================
pd.Series({'wuhan':11912.6,'hangzhou':11050.5,'nanjing':10503}) # 还可以给data参数传字典,字典的Key可以充当标签索引
>>>
wuhan       11912.6
hangzhou    11050.5
nanjing     10503.0
dtype: float64

============================================================
pd.Series({'wuhan':11912.6,'hangzhou':11050.5,'nanjing':10503},index=['nanjing','wuhan','hangzhou'])  
# 通过设置index参数
# 修改标志索引的顺序
# 设置的索引字符串如果不存在于传入字典的key中,则会用一个NaN来作为该标签索引的值
>>>
nanjing     10503.0
wuhan       11912.6
hangzhou    11050.5
dtype: float64
  • Series的属性
gdp
>>>
shanghai     27466.15
beijing      24899.30
guangzhou    19610.90
shenzhen     19492.40
tianjin      17885.39
chongqing    17558.76
suzhou       15475.09
chengdu      12170.20
dtype: float64
============================================================
# Series对象的index和values属性
# index属性获取标签索引,values属性获取元素
gdp.index
>>>
Index(['shanghai', 'beijing', 'guangzhou', 'shenzhen', 'tianjin', 'chongqing',
       'suzhou', 'chengdu'],
      dtype='object')
============================================================
gdp.values
>>>
array([27466.15, 24899.3 , 19610.9 , 19492.4 , 17885.39, 17558.76,
       15475.09, 12170.2 ])
============================================================       
gdp.name='GDP'  # name属性用来描述对象
gdp
>>>
shanghai     27466.15
beijing      24899.30
guangzhou    19610.90
shenzhen     19492.40
tianjing     17885.39
chongching    17558.76
suzhou       15475.09
chengdu      12170.20
Name: GDP, dtype: float64
============================================================
gdp.index.name='City Name'  # 可以给index对象设置name属性来设置标签索引的名称
gdp
>>>
City Name
shanghai     27466.15
beijing      24899.30
guangzhou    19610.90
shenzhen     19492.40
tianjing     17885.39
chongching    17558.76
suzhou       15475.09
chengdu      12170.20
Name: GDP, dtype: float64
DataFrame对象
  • DataFrame专门用于存储二维数据
  • pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False):创建DataFrame对象的构造函数
    • data参数:可以是嵌套列表、二维数组、字典、DataFrame对象
    • index参数:可以说索引对象或者类数组对象。
    • columns参数:同上。
      # 创建一个DataFrame对象,同时设置其index索引和columns索引
      # 当data是一个嵌套列表时
      gp=pd.DataFrame([[27466.15,2419.70],[24899.30,2172.90],[19610.90,1350.11]],index=['YN','SC','BJ'],columns=['GDP','Populations'])
      gp.index.name='行索引标签↓'  # 设置行标签索引总名称
      gp.columns.name='列索引标签→' # 设置列标签索引总名称
      gp
      >>>
      列索引标签→	  GDP	  Populations
      行索引标签↓		
              YN	27466.15	2419.70
              SC	24899.30	2172.90
              BJ	19610.90	1350.11
      ============================================================
      # 当data是一个字典时
      # 传入字典会根据字典的key来构建columns索引的值,对应的value构建实际的该columns下的数据,只需要设置index参数
      pd.DataFrame({'city':['beijing','beijing','hubei','shanghai'],'mark':[100,89,75,80]})
      >>>
      	city	mark
      0	beijing	 100
      1	beijing	 89
      2	hubei	 75
      3	shanghai 80
      # 设置index索引的值
      pd.DataFrame({'city':['beijing','beijing','hubei','shanghai'],'mark':[100,89,75,80]},index=['PKU','tsinghua','Wuhan','Fudan'])
      >>>
                  city	mark
      PKU	        beijing	 100
      tsinghua	beijing	 89
      Wuhan	    hubei	 75
      Fudan	    shanghai 80
      ============================================================
      # 当data是一个二维数组(ndarray)
      # 二维数组与传入嵌套列表相似,index和columns参数都需要设置
      u=np.array([['beijing',100],['beijing',89],['hubei',75],['shanghai',80]])
      u
      >>>
      array([['beijing', '100'],
             ['beijing', '89'],
             ['hubei', '75'],
             ['shanghai', '80']], dtype='<U8')
             
      pd.DataFrame(u,index=['PKU','Tsinghua','WHU','Fudan'],columns=['city','marks'])
      >>>
      	        city	marks
      PKU	        beijing	 100
      Tsinghua	beijing	 89
      WHU	        hubei	 75
      Fudan	    shanghai 80
      
  • 数据转换函数
    • 可转换两种类型的字典,分别是value的值是array-like和dict的字典;还有可以转换字典的items()函数的结果等等,大体相似,具体请查文档。
    • 转换字典(array-like)到DataFrame
      # 数据转换
      dict_gdp={'GDP':[27466,24899.30,19610.9,19526.3],'Population':[2419.8,2172.9,1350.1,1138.3]}  # 这个dict中的值为array-like类型
      pd.DataFrame.from_dict(dict_gdp) # 最基本的用法跟在DataFrame
                                       # 的构造函数中传入一个字典是一样的
      >>>
              GDP	Population
      0	27466.0	2419.8
      1	24899.3	2172.9
      2	19610.9	1350.1
      3	19526.3	1138.3
      ============================================================
      pd.DataFrame.from_dict(dict_gdp,orient='index') # 通过设置orient参数来控制将dict
      # 的key作为index的索引还是columns的索引,默认是columns
      >>>
      	            0	    1	    2	    3
      GDP	        27466.0	24899.3	19610.9	19526.3
      Population	2419.8	2172.9	1350.1	1138.3
      ============================================================
      # 为该函数生成的DataFrame对象设置index或者columns
      this=pd.DataFrame.from_dict(dict_gdp)  # 当orient为columns无法直接
                                             # 在函数中设置index索引的值
      this.index=['A','B','C','D']  # 需要使用index属性来设置
      this
      >>>
      	GDP	    Population
      A	27466.0	2419.8
      B	24899.3	2172.9
      C	19610.9	1350.1
      D	19526.3	1138.3
      ============================================================
      # 当orient为index可以直接使用columns参数来设置columns索引
      pd.DataFrame.from_dict(dict_gdp,orient='index',columns=['A','B','C','D'])
      >>>
      	        A	    B	    C	    D
      GDP	        27466.0	24899.3	19610.9	19526.3
      Population	2419.8	2172.9	1350.1	1138.3
      
    • 转换字典(dict)到DataFrame,字典最外围的key被orient决定位置。
      dict2_gdp={'GDP':{'SHANGHAI':27466.2,'BEIJING':24899.3,'GUANGZHOU':19610.9,'SHENZHEN':19492.6},'Population':{'SHANGHAI':419.7,'BEIJING':2172.9,'GUANGZHOU':1350.11,'SHENZHEN':1137.8}}
      dict2_gdp  # 此dict中的内容为dict类型
      >>>
      {
      'GDP': 
          {
          'SHANGHAI': 27466.2,
          'BEIJING': 24899.3,
          'GUANGZHOU': 19610.9,
          'SHENZHEN': 19492.6
          },
      'Population':
          {
          'SHANGHAI': 419.7,
          'BEIJING': 2172.9,
          'GUANGZHOU': 1350.11,
          'SHENZHEN': 1137.8
          }
      }
      gp=pd.DataFrame.from_dict(dict2_gdp)
      gp
      >>>
      	            GDP	Population
      BEIJING	    24899.3	2172.90
      GUANGZHOU	19610.9	1350.11
      SHANGHAI	27466.2	419.70
      SHENZHEN	19492.6	1137.80
      ============================================================
      pd.DataFrame.from_dict(dict2_gdp,orient='index')
      >>>
      	        SHANGHAI BEIJING GUANGZHOU	SHENZHEN
      GDP	        27466.2	24899.3	 19610.90	19492.6
      Population	419.7	2172.9	 1350.11	1137.8
      

索引对象

Index对象和MultiIndex对象
Index对象
  • Series对象的index属性得到的就是一个Index对象
  • Index对象可以看成是一维数组(ndarray)或者list
  • Index对象是不可变的。
  • 创建一个Index对象
    # 创建Index对象
    ind=pd.Index(['physics','python','math','english'])
    ind
    >>>
    Index(['physics', 'python', 'math', 'english'], dtype='object')
    
    s=pd.Series([100,90,80,77],index=ind)
    s
    >>>
    physics    100
    python      90
    math        80
    english     77
    dtype: int64
    
MultiIndex对象(后期补足)

Pandas的索引和切片

Series对象的索引与切片
  • 同样使用[]获取一个标签索引的值
    gdp
    >>>
    shanghai     27466.30
    beijing      24899.30
    guangzhou    19610.90
    shenzhen     19492.40
    tianjin      17885.39
    chongqing    17558.76
    suzhou       15475.09
    chengdu      12170.20
    dtype: float64
    ============================================================
    gdp['chengdu']
    >>>
    12170.2
    
    
  • Series对象是类字典的对象,所以可以用一些字典中的方法
    # Series对象是类字典对象
    'shanghai' in gdp  # 判断key是否在Series对象中,也就是判断Index是否在Series中
    >>>
    True
    ============================================================
    gdp.keys() # 获取一个dict中的所有key,可以用来获取一个Series中的所有Index
    # 该函数等同于使用Series实例的index属性 gdp.index == gdp.keys()
    >>>
    Index(['shanghai', 'beijing', 'guangzhou', 'shenzhen', 'tianjin', 'chongqing',
           'suzhou', 'chengdu'],
          dtype='object')
    
    
  • Series对象的切片,既可以使用标签索引也可以使用位置索引,不同于普通的list的左闭右开,Series的标签索引切片是左闭右闭的,位置索引的切片与普通list一样
    g=gdp['beijing':'chengdu'] # 两端都是闭合的
    g
    >>>
    beijing      24899.30
    guangzhou    19610.90
    shenzhen     19492.40
    tianjin      17885.39
    chongqing    17558.76
    suzhou       15475.09
    chengdu      12170.20
    dtype: float64
    ============================================================
    gdp[1:5]  # 左闭右开
    >>>
    beijing      24899.30
    guangzhou    19610.90
    shenzhen     19492.40
    tianjin      17885.39
    dtype: float64
    
  • Pandas中没有公用视图的概念,每次切片出来的都是一个新的对象
  • Series对象中如果设置了index索引为整数的后,你再使用索引获取内容时,该索引为标签索引,但是切片的时候又转换为位置索引,会很混乱,就提供了别的函数来解决该问题
# 问题
s=pd.Series(np.random.randn(4),index=[1,3,5,7])
s
>>>
1   -0.045334
3    0.215793
5   -1.173372
7   -1.638499
dtype: float64

print(s[1]) # 索引取数据如果使用了整数的标签索引,此时索引取值的位置索引就失效了
print('-----------')
print(s[1:3]) # 切片的时候打算用标签索引来切片,却被以位置索引的方式来切片了
>>>
-0.04533438552919716
-----------
3    0.215793
5   -1.173372
dtype: float64
  • Pandas针对索引提供了专门的方法
    # 专用于位置索引
    print(s.iloc[1])  
    print('-------------------------')
    print(s.iloc[1:3])
    >>>
    0.2157928673277447
    -------------------------
    3    0.215793
    5   -1.173372
    dtype: float64
    ============================================================
    # 专用于标签索引
    print(s.loc[1])  
    print('-------------------------')
    print(s.loc[1:3])
    >>>
    -0.04533438552919716
    -------------------------
    1   -0.045334
    3    0.215793
    dtype: float64
    
DataFrame对象
  • 取某列的数据
d
>>>
	        gdp	    pop
shanghai	27466	2415.27
beijing 	24899	2151.60
guangzhou	19611	1270.88

d['gdp']  # DataFrame要获取某列的数据 就直接在索引中放入columns名称
>>>
shanghai     27466
beijing      24899
guangzhou    19611
Name: gdp, dtype: int64
  • 获取某些行的切片
d['beijing':'guangzhou'] # 利用index的标签索引来切片
>>>
	        gdp	    pop
beijing	    24899	2151.60
guangzhou	19611	1270.88

d.loc['beijing':'guangzhou']  # 同上
>>>
	        gdp	    pop
beijing	    24899	2151.60
guangzhou	19611	1270.88
============================================================
d[1:3]  # 利用index的位置索引来切片
>>>
	        gdp	    pop
beijing	    24899	2151.60
guangzhou	19611	1270.88

d.iloc[1:3]  # 同上
>>>
	        gdp	    pop
beijing	    24899	2151.60
guangzhou	19611	1270.88
  • 行列约束包括索引和切片混合
d.loc['shanghai','pop']  # 全索引确定到一个值,利用标签索引
>>>
2415.27

d.iloc[0,1]  # 同上,用的是位置索引
>>>
2415.27
=====================================================
d.loc['guangzhou':,'pop':]  # 全切片,获取到一部分数据,利用标签索引
>>>
	        pop
guangzhou	1270.88

d.iloc[2:,:1]  # 同上,利用位置索引
>>>
	        gdp
guangzhou	19611
=====================================================
d.loc['shanghai','gdp':]  # 索引混合切片,利用标签索引
>>>
gdp    27466.00
pop     2415.27
Name: shanghai, dtype: float64

d.iloc[0,0:]
>>>
gdp    27466.00
pop     2415.27
Name: shanghai, dtype: float64
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值