Pandas---1.基本数据结构(Series/Index/MultiIndex/DataFrame)
一、Series
1.创建
(1)方法一
1 | class pandas.Series(data = None , index = None , dtype = None , name = None , copy = False ,fastpath = False ) |
参数:
data
:它可以是一个字典、array-like
、标量。表示Series
包含的数据,如果是序列/数组,则它必须是一维的- 如果是字典,则字典的键指定了
label
。如果你同时使用了index
,则以index
为准。 - 如果是标量,则结果为:该标量扩充为
index
长度相同的列表。
- 如果是字典,则字典的键指定了
index
:一个array-like
或者一个Index
对象。它指定了label
。其值必须唯一而且hashable
,且长度与data
一致。如果data
是一个字典,则index
将会使用该字典的key
(此时index
不起作用)。如果未提供,则使用np.arange(n)
。name
:一个字符串,为Series
的名字。dtype
:指定数据类型。如果为None
,则数据类型被自动推断copy
:一个布尔值。如果为True
,则拷贝输入数据data
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | # (1)由字典创建,字典的key就是index,values就是values dic = { 'a' : 1 , 'b' : 2 , 'c' : 3 , '4' : 4 , '5' : 5 } s = pd.Series(dic) print (s) 4 4 5 5 a 1 b 2 c 3 dtype: int64 # (2)由数组创建(一维数组) arr = np.random.randn( 5 ) s = pd.Series(arr) print (arr) print (s) # 默认index是从0开始,步长为1的数字 s = pd.Series(arr, index = [ 'a' , 'b' , 'c' , 'd' , 'e' ],dtype = np. object ) print (s) # index参数:设置index,长度保持一致 # dtype参数:设置数值类型 # (3)由标量创建 s = pd.Series( 10 , index = range ( 4 )) print (s) # 如果data是标量值,则必须提供索引。该值会重复,来匹配索引的长度 0 10 1 10 2 10 3 10 dtype: int64 |
(2)方法二
1 | Series.from_array(arr, index = None , name = None , dtype = None , copy = False , fastpath = False ) |
参数:
- arr:可以是一个字典、array-like、标量。其他参数见1.
2.将Series
转换成其他数据类型
(1).to_dict():
转换成字典,格式为{label->value}
(2).to_frame([name])
:转换成DataFrame
。name
为Index
的名字
(3).tolist()
:转换成列表
(4).to_string():转换成字符串
1 2 | .to_string(buf = None , na_rep = 'NaN' , float_format = None , header = True , index = True , length = False , dtype = False , name = False , max_rows = None ) |
参数:
buf
:一个StringIO-like
对象,是写入的buffer
na_rep
:一个字符串,代表数值NaN
float_format
:浮点数的格式化函数。应用于浮点列header
:一个布尔值。如果为True
,则添加头部信息(index name
)index
:一个布尔值。如果为True
,则添加index labels
length
:一个布尔值。如果为True
,则添加Series
的长度信息dtype
:一个布尔值。如果为True
,则添加dtype
信息name
:一个布尔值。如果为True
,则添加Series name
max_rows
:一个整数值,给出了最大转换的行数。如果为None
,则转换全部。
返回转换后的字符串。
二、Index
1.创建
创建Index
对象
1 | class pandas.Index(data = None , dtype = None , copy = False , name = None , fastpath = False , tupleize_cols = True ) |
参数:
data
:一个array-like
,必须是一维的name
:一个字符串,为Index
的名字。dtype
:指定数据类型。如果为None
,则默认为object
copy
:一个布尔值。如果为True
,则拷贝输入数据data
tupleize_cols
:一个布尔值,如果可能则尽量创建MultiIndex
对象
Index
对象负责管理轴label
和其他元数据(比如轴name
)。构建Series/DataFrame
时,传给index/columns
关键字的任何数组或者序列都将被转化成一个Index
。Index
对象是immutable
,因此用户无法对其进行修改。这样才能够使得Index
对象在多个数据结构之间安全共享。
2.多种索引类型
Index
:最泛化的Index
对象,将轴label
表示为一个Python
对象组成的Numpy
数组Int64Index
:针对整数的特殊Index
MultiIndex
:层次化索引对象,表示单个轴上的多层索引。可以看做由元组组成的数组DatatimeIndex
:存储纳秒级时间戳,用numpy
的datatime64
类型表示PeriodIndex
:针对Period
数据(时间间隔)的特殊Index
3.Index功能
Index
的功能类似一个固定大小的集合。其类似于集合的方法有(因为Index
不可变,因此返回的都是新的Index
对象):
.copy([name,deep,dtype])
:返回一份Index
的拷贝。.append(other)
:连接另一个Index
对象,产生一个新的Index
对象。注意重复的label
并不会合并.difference(other)
:计算差集,返回一个Index
对象.intersection(other)
:计算交集,返回一个Index
对象.union(other)
:计算并集,返回一个新的Index
对象.isin(values[, level])
:计算Index
中各label
是否在values
中.delete(loc)
:删除下标loc
处的元素,得到新的Index
.drop(labels[, errors])
:删除传入的labels
,得到新的Index
.insert(loc, item)
:在指定下标位置插入值,得到新的Index
.unique()
:返回Index
中唯一值的数组,得到新的Index
4.将Index转换成其他数据类型
.astype(dtype,[,copy])
:转换成另一个数据类型的Index
,其label
的dtype
被转换成指定的值.tolist()
:转换成列表.to_series(**kwargs)
:转换成Series
,Series
的数据和label
相同
5.Index提供的选取方法
-
.get_indexer(target[, method, limit, ...])
:获取target
(一个Index
对象)对应的下标列表。-
target
:一个Index
对象。我们要考察的就是Index
中的每个label
在self
中的下标序列。 -
method
:指定label
的匹配方法。可以为None
,表示严格匹配(如果不存在则下标为 -1)。如果为'pad'/'ffill'
,则:若未找到匹配的,则使用前向匹配。如果为'backfill'/'bfill'
,则:若未找到匹配的,则使用后向匹配。如果为'nearest'
,则:若未找到匹配的,则使用最近邻匹配。匹配时,假设你的
Index
的label
是有序排列的(要么是升序,要么是降序) -
limit
:一个整数,指定前向/后向/最近填充时:如果有连续的k
个NaN
,则只填充其中limit
个。 -
tolerance
:一个整数,用于给出在不匹配时,连续采用前向/后向/最近邻匹配的跨度的最大值。
-
-
.get_level_values(level)
:返回指定level
的Index
,用于MultiIndex
。 -
.get_loc(key[, method, tolerance])
:返回指定label
处的下标,由key
指定。其中method
和tolerance
参数见上述。如果method=None
,且key
指定的label
找不到,则抛出异常。 -
.get_value(series, key)
:寻找Series
指定label
处的值。若key
指定的label
找不到,则抛出异常。 -
.slice_locs([start, end, step, kind])
:计算给定start label
和end label
之间的下标序列,返回代表该下标序列的切片或者数组。其中不包括end
三、MultiIndex
1.创建
(1)方法一
1 | class pandas.MultiIndex(levels = None , labels = None , sortorder = None , names = None ,copy = False , verify_integrity = True , _set_identity = True , name = None , * * kwargs) |
参数:
-
levels
:一个数组的列表,给出了每一级的level
。 -
labels
:一个数组的列表,给出了每一级level
的下标。第i
级label
是这样产生的:- 首先获取
labels[i]
,它是一个下标序列,代表第 级。 - 假设第
k
位置为整数 3,在第 级第 位的label
就是levels[i][3]
。
- 首先获取
-
sortorder
:一个整数,给出了已经排序好了的level
级别。 -
names
:一个字符串序列,给出了每个Index
的name
。其中每个级别对应一个Index
-
copy
:一个布尔值。如果为True
,则拷贝基础数据 -
verify_integrity
:一个布尔值。如果为True
,则检测各级别的label/level
都是连续的且有效的 -
name
:指定了本MultiIndex
的名字
MultiIndex
代表的是多级索引对象。它继承自Index
,其中的多级label
采用元组对象来表示。在MultiIndex
内部,并不直接保存元组对象,而是使用多个Index
对象保存索引中每级的label
。
(2)其他方法
MultiIndex.from_arrays(arrays[, sortorder, ...])
:将二维序列转换为MultiIndex
。其中arrays
为array-like
的序列,每个array-like
按顺序的给出了一列label
(一个级别)MultiIndex.from_tuples(tuples[, sortorder, ...])
:将元组序列转换为MultiIndex
。其中tuples
为tuple-like
的序列,每个array-like
按顺序的给出了一行label
对(不同级别的一对)MultiIndex.from_product(iterables[, ...])
:根据多个可迭代对象生成一个MultiIndex
,其中使用笛卡尔积的算法。其中iterables
为可迭代对象的序列
你也可以通过传递一个元组列表给Index()
,并且将tupleize_cols
设置为True
来创建MultiIndex
四、DataFrame
1.DataFrame介绍
DataFrame
是一个表格型的数据结构,它含有一组有序的列,每一列都可以是不同的值类型(数值、日期、object
类型)。其中object
类型可以保存任何python
对象,比如字符串。同一列必须是相同的值类型。
DataFrame
既有行索引,又有列索引。他可以被看作为Series
组成的字典(共用同一个行索引)DataFrame
中面向行和面向列的操作基本上是平衡的。其实DataFrame
中的数据是以一个或者多个二维块存放的
2.创建
1 | class pandas.DataFrame(data = None , index = None , columns = None , dtype = None , copy = False ) |
参数:
data
:可以是一个二维数组、字典、或者DataFrame
。index
:一个Index
或者array-like
对象(必须为一维的),它指定了行标签。如果未提供,则使用np.arange(n)
。columns
:一个Index
或者array-like
对象(必须为一维的),它指定了列标签。如果未提供,则使用np.arange(n)
。dtype
:指定数据类型。如果为None
,则数据类型被自动推断copy
:一个布尔值。如果为True
,则拷贝输入数据data
常见的构造DataFrame
有以下情况:
- 二维
ndarray
:data
就是数据,此时可以传入index/columns
参数 - 一个字典,其中字典的值为一维数组、一维列表、一维元组:此时每个键就是列索引,对应的值就是列数据。要求所有序列的长度相同
numpy
的结构化数组:类似于由数组组成的字典Series
组成的字典:此时每个键就是列索引,对应的Series
就是列数据。如果没有显式的指定行索引,那么各个Series
的索引将会被合并成DataFrame
的行索引。- 字典的字典:各个内层字典会成为一列,键会被合并成结果的行索引。跟
Series 组成的字典
情况一致 - 字典或者
Series
的列表:每一项将会成为DataFrame
的一行。字典的键、Series
索引的并集将会成为DataFrame
的列索引 - 列表、元组组成的列表:类似于二维
ndarray
- 另一个
DataFrame
:该DataFrame
的索引将会被沿用,除非显式指定其他索引 numpy
的MaskedArray
:类似于二维ndarray
,只是掩码值在结果DataFrame
中会变成NA/缺失值
columns
/index
有两种作用:如果构造的DataFrame
没有索引,则它们分别给索引赋值;如果构造的DataFrame
已有索引,则它们按照指定顺序排列指定的索引。
3.从其他数据结构中创建DataFrame
(1)DataFrame.from_dict()
1 | DataFrame.from_dict(data, orient = 'columns' , dtype = None ) |
从字典中创建DataFrame
。
data
:是个字典,其格式为:{key:array-like}
或者{key:dict}
。orient
:指定了key
为行还是列。参数的值为'columns'
(key
为列的label
,默认行为);或者'index'
(key
为行的label
)dtype
:数据类型。如果为None
,则自动推断。
(2)DataFrame.from_items()
1 | DataFrame.from_items(items, columns = None , orient = 'columns' ) |
从元组序列中创建DataFrame
。
items
:为元组序列,元组格式为:(key,value)
,其中value
为表示一维数据的序列或者Series
对象。columns
:一个序列,给出列的labels
。- 当
orient='index'
时必须传入(此时key
指定的是行的label
),且长度不能大于DataFrame
的列数。 - 当
orient='columns
时,key
就是列的label
,此时columns
关键字参数指定的列label
必须等于某个key
;否则抛出异常。 orient
:参见.from_dict
的解释。
4.将DataFrame转换为其他数据类型
(1).to_dict()
.to_dict(*args, **kwargs)
方法:转换成字典。参数orient
决定了转换方式。
orient ='dict'
:字典的形式为:{col_label:{index_label:value}}
(默认行为)orient ='list'
:字典的形式为:{col_label:[values]}
orient ='series'
:字典的形式为:{col_label:Series(values)}
orient ='split'
:字典的形式为:{'index':[index_labels],'columns':[col_labels],'data':[values]}
orient ='records'
:字典的形式为:[{col_label:value},...,{col_label:value}]
orient ='index'
:字典的形式为:{index_label:{col_label:value}}
- 你可以使用简化字符串,如
's'
代表'series'
,'sp'
代表'split'
(2).to_records()
.to_records(index=True, convert_datetime64=True)
方法:转换成结构数组。
index
:一个布尔值。如果为True
,则结果中包含index
convert_datetime64
:一个布尔值,如果为True
,则转换DatetimeIndex
为datetime.datetime
(3).to_string()
将DataFrame转换成字符串
1 2 3 4 | to_string(buf = None , columns = None , col_space = None , header = True , index = True , na_rep = 'NaN' , formatters = None , float_format = None , sparsify = None , index_names = True , justify = None , line_width = None , max_rows = None , max_cols = None , show_dimensions = False ) |
功能:
-
buf
:一个StringIO-like
对象,是写入的buffer
-
columns
:一个序列,指定了列标签的一个子集,该子集的数据被输出 -
col_space
:一个整数,指定了每一列的最小宽度 -
header
:一个布尔值。如果为True
,则添加头部信息(column labels
) -
index
:一个布尔值。如果为True
,则添加index labels
-
na_rep
:一个字符串,代表数值NaN
-
float_format
:浮点数的格式化函数(单参数)。应用于浮点列 -
formatters
:一个单参数函数的列表(列表长度等于列数)或者一个单参数函数的字典。- 如果是列表,则根据列号,对应使用格式化函数
- 如果是字典,则根据列
label
,对应使用格式化函数
-
sparsify
:一个布尔值。Set to False for a DataFrame with a hierarchical index to print every multiindex key at each row, default True -
index_names
:一个布尔值。如果为True
,则添加index names
-
justify
:指定column label
的对齐方式。可以为'left'
(左对齐),或者'right'
(右对齐)。默认为None
返回转换后的字符串。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
2018-12-27 去掉python的警告