一些奇怪的Pandas使用

本文最后更新于:2024年8月11日 晚上

Pandas

对象

Series

Series对象是Pandas的同类的一维数组对象集合,它包括整数0索引数据本身数据类型标识,输出时会按照以下格式输出:

Series创建

创建Series对象的方式如下:

1
2
import pandas as pd
pd.Series(data,index,dtype,copy)
  • data:储存的数据,可以是列表或ndarry
  • index:索引值,默认为np.arrange(n)
  • dtype: 类型说明,可以自动判断,使用列表可以传入索引,要求长度至少大于数据长度,空值填充NaN
  • copy:对data进行拷贝,默认为False

创建空Series对象

1
2
3
4
a = pd.Series()
print(a)
>>>
Series([],dtype: float64)

介绍用dict创建Series,使用==字典创建==时会按照==键==建立索引

不传递索引

1
2
3
4
5
6
7
8
9
10
import pandas as pd
# 注意这里有的数字只有一个小数点,也是浮点数
data = {"a":1.0,"b":2.,"c":3.}
s = pd.Series(data)
print(s)
>>>
a 1.0
b 2.0
c 3.0
dtype: float64

传递索引

1
2
3
4
5
6
7
8
9
10
import pandas as pd
data = {"a":1.0,"b":2.,"c":3.}
s = pd.Series(data,index=['d','c','b','a'])
print(s)
>>>
d NaN
c 3.0
b 2.0
a 1.0
dtype float64

数据为恒常数

如果数据是恒常数,必须传入索引,这样才知道有多少个常熟

1
2
3
4
5
6
7
8
9
import pandas as pd
s = pd.Series(5,index=[0,1,2,3])
print(s)
>>>
0 5
1 5
2 5
3 5
dtype: int64

Series访问

得益于建立了索引,这个数据集可以使用索引访问,也保留了下标访问的方式,返回的是数据本身

1
2
3
4
5
6
7
8
9
...
s = pd.Series([1,2,3,4],index=['a','b','c','d'])
# 下标访问
print(s[0])
# 索引访问
print(s['a'])
>>>
1
1

切片访问

类似于列表,数据集也是可以切片的,返回的还是Series对象

1
2
3
4
5
6
7
8
...
s = pd.Series([1,2,3,4],index=['a','b','c','d'])
print(s[:3])
>>>
a 1
b 2
c 3
dtype: int64

多索引访问:需要使用包含索引的列表去访问,返回的还是Series对象

1
2
3
4
5
6
7
8
...
s = pd.Series([1,2,3,4],index=['a','b','c','d'])
print(s[['a','b','d']])
>>>
a 1
b 2
d 4
dtype: int64

像字典一样,若没有这个索引,则触发KeyError异常

常用方法

名称 属性
axes 以列表的形式返回所有行索引标签。
dtype 返回对象的数据类型。
empty 判断空值
ndim 返回输入数据的维数,Series是一位数据,只返回1
size 返回输入数据的元素数量,即长度
index 返回一个RangeIndex对象,用来描述索引的取值范围
类似于RangeIndex(start=0,stop=5,step=1)
values 以数组的形式返回Series中的数据(不反回索引)

数据检视

使用*.head(n)返回n行头数据,默认是5行
使用*.tail(m)返回m行尾数据,默认是5行
返回的内容也是Series对象

使用*.isnull()*.notnull进行缺失值检测
返回的是一个布尔值组成的Series对象,他的索引就是各个值的所在位置,值即为是否是确实值

DataFrame

有一维数据结构,肯定得有一个二维数据结构,DataFrame就是一个二维数据结构

它的行、列都有相应的行标签、列标签,而且是一个==异构==数据表
==异构==:表格中的元素可以是不同类型,就跟Excel一样

隐式标签:就是常见的从0开始的下标访问
显示标签:自己给他们定义一个访问标签
列标签甚至还能是不同的数据类型,虽然不推荐这么做

对象创建

1
2
import pandas as pd
pd.DateFrame(data,index,columns,dtype,copy)
参数名称 说明
data 输入的数据,可以是 ndarray,series,list,dict,标量以及一个 DataFrame。
index 行标签,如果没有传递 index 值,则默认行标签是 np.arange(n),n 代表 data 的元素个数。
columns 列标签,如果没有传递 columns 值,则默认列标签是 np.arange(n)。
dtype dtype表示每一列的数据类型。
copy 默认为 False,表示复制数据 data。

直接使用pd.DateFrame()可以创建空的对象

单列表创建

可以使用一个列表或者嵌套列表来创建DataFrame对象

1
2
3
4
5
6
7
8
9
10
import pandas as pd
data = [1,2,3,4]
df = pd.DataFrame(data)
print(df)
>>>
/ 0
0 1
1 2
2 3
3 4

嵌套列表创建

这里还传入了一个==列索引==

1
2
3
4
5
6
7
8
9
import pandas as pd
data = [["Xiao",1],["Jinzhi",2],["Dustella",3]]
df = pd.DataFrame(data,columns=["Name","Age"])
print(df)
>>>
\ Name Age
0 Xiao 1
1 Jinzhi 2
2 Dustella3

你还可以修改数值的数据类型,保留一位小数点,上面的Line3改为df = pd.DataFrame(data,columns=["Name","Age"],dtype=float)即可,Age将自动出现小数点

嵌套字典创建

1
2
3
4
5
6
7
8
9
import pandas as pd
data = {"name":["Xiao","Jinzhi","Dustella"],"Age":[1,2,3]}
df = pd.DateFrame(data)
print(df)
>>>
\ name Age
0 AXiao 1
1 Jinzhi 2
2 Dustella3

自然,我们也可以分配==行索引==

1
2
3
4
5
6
7
8
9
import pandas as pd
data = {"Name":["Xiao","Dustella","Jinzhi"],"Age":[1,2,3]}
df = pd.DataFrame(data,index=["Line1","Line2","Line3"])
print(df)
>>>
\ Name Age
Line1 Xiao 1
Line2 Dustella2
Line3 Jinzhi 3

列表套字典创建

1
2
3
4
5
6
7
8
import pandas as pd
data = [{'a':1,'b':2},{'a':5,'b':10},'c':20}]
df = pd.DataFrame(data)
print(df)
>>>
\ a b c
0 1 2 NaN
1 5 10 20

当然,可以建立一个行索引df = pd.DataFrame(data,index=[“Line1”,”Line2"])

更高级的,可以把字典==键==当==列索引==,当找不到这个列时,所有行的值自动置(NaN),没被选中的键则自动==丢弃==

1
2
3
4
5
6
7
8
9
import pandas as pd
data = [{"a":1,"b":2},{"a":10,"b":20,"c":114514}]
df = pd.DataFrame(data,index=["L1","L2"],columns=["a","b","d"])
print(df)
# 可以发现,c列被丢弃了,d列全是置空
>>>
\ a b d
L1 1 2 NaN
L2 10 20 NaN

从Series对象构建

因为Series是一维数组,因此只能当成行或列,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd
# 因为有行标签,因此是列向量
S1 = pd.Series([11,45,14],index=['a','b','c'])
S2 = pd.Series([19,19,81,0],index=['a','b','c','d'])
# 构造字典
data = {"Column1":S1,"Column2":S2}
df = pd.DataFrame(data)
print(df)
>>>
\ Column1 Column2
a 11 19
b 45 19
c 14 81
d NaN 0

数据访问

pass

Excel

写入

使用to_excel()可以将一个DataFrame对象写入目标表格中,完整的写法如下:

1
2
3
4
DataFrame.to_excel
(excel_writer, sheet_name='Sheet1', na_rep='',
float_format=None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None,
merge_cells=True, encoding=None, inf_rep='inf', verbose=True, freeze_panes=None)

本来只想解释部分参数,但是全部都很重要:

参数名称 描述说明
excel_wirter 文件路径或者 ExcelWrite 对象。
sheet_name 指定要写入数据的工作表名称。
na_rep 缺失值的表示形式。
float_format 它是一个可选参数,用于格式化浮点数字符串。
columns 指要写入的列。
header 写出每一列的名称,如果给出的是字符串列表,则表示列的别名。
index 表示要写入的索引。
index_label 引用索引列的列标签。如果未指定,并且 hearder 和 index 均为为 True,则使用索引名称。如果 DataFrame 使用 MultiIndex,则需要给出一个序列。
startrow 初始写入的行位置,默认值0。表示引用左上角的行单元格来储存 DataFrame。
startcol 初始写入的列位置,默认值0。表示引用左上角的列单元格来储存 DataFrame。
engine 它是一个可选参数,用于指定要使用的引擎,可以是 openpyxl 或 xlsxwriter。

简单介绍[废弃]

Excel读取

打开Excel文件,读取表sheet,以第1行为表头(从0开始)

1
2
import pandas as pd
excel = pd.read_excel("Excel_File_Path.xlsx",sheet_name="sheet1",header=0)

要求表格名称相同,默认读取第一张表,也可以使用从0开始读取表格编号

基本行操作

读取前n

1
excel.head(n)

读取行的方法有两种,一种是按索引读取*.loc一种是按从0开始的下标索引*.iloc,这里主要说明下标索引

返回的内容是该行的包含所有列的对象

读取第二行

1
excel.iloc[1]

读取1~4行

1
excel.iloc[1:5]

修改行(或添加新行数据)

跟字典一样,通过下标访问,通过赋值修改,一般要求列表元素数量跟列数量一样多

1
excel.iloc[1] = [0,0,0,0,0]

基本列操作

读取指定列:

1
colume = excel['Colume_Name']

筛选列中的数据:

1
colume[colume>5]

读取多列:

1
multi_colume[['Colume_1','Colume_2','Colume_3']]

基本单元格

读取某两列下的第3行到第4行

1
excel[["Column_Nmae","Column_Name2"]].iloc[2:5]

一种简写方法:

访问第3~4行,读取2,4列

1
excel.iloc[2:5,1:3]

删除

删除行:

删除第3、第4行,inplcae:要求在原表修改,否则会返回一个新表对象

1
excel.drop([2,3],inplcae=True)

删除列:

1
excel.drop(columns=['Column_Name'],inplace=True)

Excel写入

将缓存表输出成文件,index:不建立索引

1
excel.to_excel("测试输出",index=False)

一些奇怪的Pandas使用
https://qlozin.top/2022/11/19/Pandas_Learn/
作者
QLozin
发布于
2022年11月20日
更新于
2024年8月11日
许可协议