DataFrame,pandas索引,重置索引

DataFrame,pandas索引,重置索引,第1张

3.1.2 DataFrame

DataFrame是一个类似于二维数组或表格的对象,它每列的数据可以是不同的数据类型。与Series的结构相似,DataFrame的结构也是有索引和数据组成的,不同的是,DataFrame的索引不仅有行索引,还有列索引

可以使用一下构造方法创建:

pandas.DataFrame(data=None, inedx=None,columns=None,
                 dtype=None,copy=False)

其中常用参数所表示的含义
参数 含义
Index 行标签,如果没有传入索引参数,则默认会自动创建一个0~N的整数索引
Columns 列标签,如果没有传入索引参数,则默认会自动创建一个0~N的整数索引

例1:

import numpy as np
import pandas as pd
demo_arr=np.array([['a', 'b', 'c'], ['d', 'e', 'f']])#创建数组
df_obj = pd.DataFrame(demo_arr)
print(df_obj)

例2:创建DataFrame对象,指定列索引

df_obj1 = pd.DataFrame(demo_arr, columns=['No1', 'No2', 'No3'])
print(df_obj1)

例3:获取列索引为“No2”的一列数据

element = df_obj1['No2']#通过列索引的方式获取一列数据
print(element)
print(type(element))#查看返回结果的类型

例4:使用访问属性的方式,获取属性为No2的一列数据

element = df_obj1.No2
print(element)
print(type(element))#查看返回结果的类型

注意:在获取DataFrame的一列数据时,推荐使用列索引的方式完成,主要是因为在实际使用中,列索引的名称中很有可能带有一些特殊符号(如空格),这时使用“点字符”进行访问就显得不太合适了

为DataFrame添加一列数据,则可以通过给列索引或者列名称赋值的方式实现,类似于给字典增加键值对的 *** 作。不过,新增的长度必须与其他的列的长度保持一致,否则会出现ValueError异常。

例1:增加No4一列数据

df_obj1['No4'] = ['g', 'h']
print(df_obj1)

例2:删除某一列数据,则可以使用del语句实现

del df_obj1['No3']
print(df_obj1)
3.2 pandas索引 *** 作及高级索引 3.2.1 索引对象

Pandas中的索引都是index类对象,又称为索引对象,该对象是不可以进行修改的,以保障数据的安全

示例代码:创建series类对象,为其指定索引,然后在对索引重新赋值

import pandas as pd
ser_obj = pd.Series(range(5), index=['a', 'b', 'c', 'd', 'e'])
ser_index = ser_obj.index
print(ser_index)

2)

import pandas as pd
ser_obj = pd.Series(range(5), index=['a', 'b', 'c', 'd', 'e'])
ser_index = ser_obj.index
print(ser_index)
ser_index['2'] = 'cc'
print(ser_index)

Index类对象的不可变特性是非常重要的,多个数据结构之间才能安全地共享inedx类对象
例:创建两个共用同一个index对象的series类duixiang

import pandas as pd
ser_obj1 = pd.Series(range(3), index=['a', 'b', 'c'])
ser_obj2 = pd.Series(['a', 'b', 'c'], index=ser_obj1.index)
print(ser_obj2.index is ser_obj1.index)
print(ser_obj2)
print(ser_obj1)

常见的pandas提供的index对象子类
对象 描述
Int64Index 针对整数的特殊index对象
MultiIndex 层次化索引,表现单个轴上的多层索引
DatetimeIndex 存储纳秒寄时间戳

3.2.2 重置索引

Reindex( )是pandas提供的重要方法,起作用是对原索引和新索引进行匹配,也就是说,新索引含有原索引的数据,而原索引数据按照新索引排序。如果新索引中没原索引数据,那么程序不仅不会报错还会添加新索引,并将之填充为NaN或者使用fill_vlues( )填充其他值

语法:

DataFrame.reindex(labels=None, index=None, columns=None,
                  axis=None, method=None, copy=True, level=None,
                  fill_value=nan, limit=None, tolerance=None)

语法参数的含义
参数 含义

Index用作索引的新序列
Method插值填充方式
Fill_value引入缺失值使用的替换值
limit向前或向后填充时的最大填充量

例:

import pandas as pd
ser_obj = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
print(ser_obj)

#重新索引

ser_obj2 = ser_obj.reindex(['a', 'b', 'c', 'd', 'e', 'f'])
print(ser_obj2)

注:使用reindex()方法对索引重新排列,变为“a,b,c,d,e,f”由于索引“f”对应的值不存在,所以使用NaN对确实的数据进行不填充

也可使用fill_value参数来指定缺失值:

import pandas as pd
ser_obj = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
ser_obj2 = ser_obj.reindex(['a', 'b', 'c', 'd', 'e', 'f'],
                           fill_value=6)
print(ser_obj2)

注:fill_value()参数会让所有缺失数据都填充为同一个值

如果期望使用相邻的元素值(前边或者后边元素的值)进行补充,则可以使
用method参数
Method参数的可用值

参数说明
Ffill或者pad前向填充值
Bfill或者backfill后向填充值
nearest从最近的索引值填充

Method参数示例:
1)创建Series对象,并为其指定索引

import pandas as pd
ser_obj3 = pd.Series([1, 3, 5, 7], index=[0, 2, 4, 6])
print(ser_obj3)

2)重新索引,前向填充值

3.2.3 索引 *** 作

1.Series类对象属于一维结构,他只有行索引,而DataFrame类属于二维结构,同时拥有行索引和列索引

Series有关索引的用法类似于Numpy数组索引,只不过series的索引值不只是整数。可以通过索引的位置来获取,也可以使用索引名称来获取

例:

import pandas as pd
ser_obj = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
print(ser_obj[2])  #使用索引位置获取数据
print(ser_obj['c'])  #使用索引名称获取数据

Series也可以使用切片来获取数据,不过如果使用的是位置索引来进行切片,则切片结果和list切片类似,既包含起始位置但不包含结束位置:如果使用索引名称进行切片,则切片结果是包含结束位置的
例:

print(ser_obj[2: 4]) #使用位置索引进行切片
 
print(ser_obj['c': 'e'])#使用索引名称进行切片

如果希望获取的是不连续的数据,则可以通过不连续索引来实现
例:

print(ser_obj[[0, 2, 4]]) #通过不连续位置索引获取数据集
 
print(ser_obj[['a', 'c', 'd']])#通过不连续索引名称获取数据集

布尔型索引同样适用于pandas,具体用法跟数组的用法一样,将布尔型的数组索引作为模板筛选数据,返回与模板中True位置对应的元素代码如下:

ser_bool = ser_obj > 2 #创建结果为True的数据
print(ser_bool)
 
print(ser_obj[ser_bool])#获取结果为True的数据
 
2.DataFrame的索引 *** 作

DataFrame结构既包含行索引也包含列索引。其中行索引是通过index属性进行获取的,
列索引是通过columns属性进行获取的索引的结构 ,DataFrame中每列数据都是一个series对象,我们可以通过使用列索引进行获取,代码如下:

import pandas as pd
import numpy as np
arr = np.arange(12).reshape(3, 4)
#创建DataFrame对象,并为其指定列索引
df_obj = pd.DataFrame(arr, columns=['a', 'b', 'c', 'd'])
print(df_obj)
 
print(df_obj['b'])#获取b列的数据
 
print(type(df_obj['b']))
 

如果要从DataFrame中获取多个不连续的series对象,则同样可以使用不连续索引进行实现,代码如下:

print(df_obj[['b', 'd']])#获取不连续的series对象
 
print(df_obj[ : 2])#使用切片获取第0~1行的数据
 

#使用多个切片先通过行索引获取第0~2行的数据
#再通过不连续列索引获取第b,d列的数据
print(df_obj[ :3] [['b', 'd']])

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/714039.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存