问题引入
现在有这么一个需求
我要对我的很多设备进行快照处理,打完快照之后需要记录我的设备IP和快照时间
当我们解决了需求的其他内容,只剩记录信息的时候,可以怎么做呢
这时候就可以引入我们的pandas模块啦,它对数据进行一系列的数据
现在我先讲步骤列出,我们带着步骤进行学习
步骤
- 获取数据并进行处理
- 生成pd对象
- 将内容写入SCV
- 追加写入内容
- 读取文件中内容
前期准备
安装pandas
pip install pandas
导入包
import pandas
数据结构
Series
类似于表格中的一个列或者说一维数组
构造函数
pandas.Series( data, index, dtype, name, copy)
参数说明
- data:一组数据(ndarray 类型)。
- index:数据索引标签,如果不指定,默认从 0 开始。
- dtype:数据类型,默认会自己判断。
- name:设置名称。
- copy:拷贝数据,默认为 False。
使用数组创建
a = [1, 2, 3]
myvar = pd.Series(a)
print(myvar)
指定索引值
a = ["Google", "Runoob", "Wiki"]
myvar = pd.Series(a, index = ["x", "y", "z"])
print(myvar)
根据索引值读取数据
a = ["Google", "Runoob", "Wiki"]
myvar = pd.Series(a, index = ["x", "y", "z"])
print(myvar["y"])
使用字典创建
使用字典创建Series就不需要指定其索引值了,其字典中的key就变成了索引值
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}
myvar = pd.Series(sites)
print(myvar)
如果只需要字典中的一部分数据,只需要指定需要数据的索引即可
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}
myvar = pd.Series(sites, index = [1, 2])
print(myvar)
设置名称参数
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}
myvar = pd.Series(sites, index = [1, 2], name="RUNOOB-Series-TEST" )
print(myvar)
DataFrame
也是一个表格型的数据结构,它含有有一组有序的列,每列可以是不同的值类型。
它既有行索引也有列索引,可以看做是由Series组成的字典(共用一个索引)
参数说明
- data:一组数据(ndarray、series, map, lists, dict 等类型)。
- index:索引值,或者可以称为行标签。
- columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
- dtype:数据类型。
- copy:拷贝数据,默认为 False。
二维数组创建
data = [['Google',10],['Runoob',12],['Wiki',13]]
df = pd.DataFrame(data,columns=['Site','Age'],dtype=float)
print(df)
使用 ndarrays 创建
data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
df = pd.DataFrame(data)
print (df)
使用字典创建
没有对应的部分数据为NaN
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print (df)
获取行数据
使用 loc 属性返回指定行的数据,如果没有设置索引,第一行索引为 0,第二行索引为 1
返回结果也就是一个 Series 数据
data = {
"calories": [420, 380, 390],
"duration": [50, 40, 45]
}
# 数据载入到 DataFrame 对象
df = pd.DataFrame(data)
# 返回第一行
print(df.loc[0])
# 返回第二行
print(df.loc[1])
也可以返回多行数据,使用 [[ … ]] 格式,… 为各行的索引,以逗号隔开
此处返回的是 DataFrame 数据
# 返回第一行和第二行
print(df.loc[[0, 1]])
指定索引
data = {
"calories": [420, 380, 390],
"duration": [50, 40, 45]
}
df = pd.DataFrame(data, index = ["day1", "day2", "day3"])
print(df)
操作 CSV 文件
CSV文件多数以逗号分割,其文件以纯文本形式存储表格数据(数字和文本)
写入SCV文件
使用 pandas 的 to_csv 方法写入
# 三个字段 name, site, age
nme = ["Google", "Runoob", "Taobao", "Wiki"]
st = ["www.google.com", "www.runoob.com", "www.taobao.com", "www.wikipedia.org"]
ag = [90, 40, 80, 98]
# 字典
dict = {'name': nme, 'site': st, 'age': ag}
df = pd.DataFrame(dict)
# 保存 dataframe
df.to_csv('site.csv')
读取CSV文件
df = pd.read_csv('文件名')
print(df.to_string())
to_String() 用于返回 DataFrame 类型的数据
如果不使用该函数,则输出数据的前面5行和后面5行,中间部分以 … 代替。
读取前几行
使用head() 方法,中间可以写入读取的行数,不填默认读取5行
df = pd.read_csv('文件名')
print(df.head(10))
读取后几行
使用tail() 方法,中间可以写入读取的行数,不填默认读取5行
df = pd.read_csv('文件名')
print(df.tail(10))
返回表格基本信息
使用 info() 方法返回表格的一些基本信息
df = pd.read_csv('文件名')
print(df.info())
解决问题
# 首先构造我们获取到的数据
data = [
{'ip':'192.168.1.4','time':'2023-8-10'},
{'ip':'192.168.1.6','time':'2023-8-10'},
]
# 写入csv文件进行保存
df = pd.DataFrame(data)
# index_label 设置不包含行索引
df.to_csv('test1.csv',index_label=False)
此时我们需要考虑之前如果已经保存过这个文件,那么我们的写入动作就变为追加写入。
data = [
{'ip':'192.168.1.4','time':'2023-8-10'},
{'ip':'192.168.1.6','time':'2023-8-10'},
]
df = pd.DataFrame(data)
# 获取文件路径
file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),'test1.csv')
if os.path.exists(file_path):
# 如果存在则追加写入
df.to_csv('test1.csv', mode='a', index_label=False, header=False)
else:
# 如果不存在则创建文件写入
df.to_csv('test1.csv', index_label=False)
# 打印输出结果
df = pd.read_csv('test1.csv')
print(df.to_string())
# 查看 ip 列属性
list = df["ip"].tolist()
print(list)