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 存储纳秒寄时间戳
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']])
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)