在pandas库中,Series和DataFrame是pandas最基本的两种数据结构。
在pandas中,Series是一维容器,表示的是DataFrame的每一行或每一列:
- 可以把DataFrame看作是由Series对象组成的字典,其中key的列名,Series是字典的值。
- Series和Python中的列表相似,不同的是Series中的每个数据必须是同类型的。
Series
Series的创建
- Series的创建最简单的方法就是传入一个同类型的列表。
import pandas as pd
s = pd.Series([1, 2, 3, 4, 5])
"""
输出结果为:
0 1
1 2
2 3
3 4
4 5
dtype: int64
"""
- 创建Series时,可以通过index参数,指定行索引。
import pandas as pd
s = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
print(s)
"""
输出结果为:
a 1
b 2
c 3
d 4
e 5
dtype: int64
"""
Series的常用操作
- Series和DataFrame数据类型通常在大模型的训练中被用于读取csv数据文件来做数据分析和预处理。
import pandas as pd
df = pd.read_csv('data/nobel_prizes.csv', index_col='id') # read_csv()内的参数就是待读取文件在本地的路径。
# 这种方式读取的csv文件结果为DataFrame对象,还需要通过一些操作才能转换为Series对象。
s = df.loc[941] # loc()的参数为想要读取的列名的index值。
print(s)
输出结果如下:
- 通过index和values属性获取索引和值。
print(s.index)
print(s.value)
输出结果如下:
- Series的keys方法与index属性相同,都是返回索引列。
print(s.keys())
输出结果如下:
- Series的常用属性介绍
属性 | 说明 |
---|---|
loc | 使用索引值取子集 |
iloc | 使用索引值位置取子集 |
dtype/dtypes | Series内容的类型 |
T | Series矩阵的转置 |
shape | 数组的维度 |
size | Series中的元素(不计算NULL值,若需统计NULL,用len()) |
value/valuse | Series的值 |
index | 获取Series的索引 |
import pandas as pd
import os
print(os.getcwd())
# 2: 创建series对象,读取一个csv文件
df = pd.read_csv('data/nobel_prizes.csv', index_col='id')
# 从上述的df中,获取到第一行数据,即series对象,进行属性操作演示
first_row = df.iloc[0]
print(first_row)
print(type(first_row))
# 3:演示series的常用属性
print(first_row.dtype) # 获取series的元素类型, object(字符串)
print(first_row.dtypes) # 获取series的元素类型, object(字符串)
print(first_row['year'], first_row['year'].dtype) # 2017 int64
print(first_row.shape) # 维度:(7,)
print(first_row.size) # 元素个数:7
print(first_row.index) # Index(['year', 'category', 'overallMotivation', 'firstname', 'surname', 'motivation', 'share'], dtype='object')
print(first_row.values) # [2017 'physics' nan 'Rainer' 'Weiss' '"for decisive contributions to the LIGO detector and the observation of gravitational waves"'2]
print(first_row.keys()) # Index(['year', 'category', 'overallMotivation', 'firstname', 'surname','motivation', 'share'], dtype='object')
- Series的常用方法介绍
head()和tail() | 获取前n行数据和后n行数据 |
---|---|
count() | 获取series的非空元素个数 |
sum() | 获取series的元素和 |
mean() | 获取series的元素平均值 |
mode() | 获取series的元素众数 |
min() | 获取series的元素最小值 |
max() | 获取series的元素最大值 |
import pandas as pd
# 2: 创建series对象
s1 = pd.Series([1, 2, 3, 4, 2, 3], index=['a', 'b', 'c', 'd', 'e', 'f'])
print(s1.max)
print(s1.max())
print(s1.size)
print(s1.min())
print(s1.to_list()) # [1, 2, 3, 4, 2, 3]
print(s1.to_list) # [1, 2, 3, 4, 2, 3]
print("---------------------------")
# 3:演示series的常用方法
print(len(s1)) # 6
print(s1.size) # 6
print(s1.head()) # 默认打印前五条
print(s1.head(3)) # 打印前3条
print(s1.tail()) # 默认打印后5条
print(s1.tail(3)) # 打印后3条
print(s1.index) # Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
print(s1.keys()) # Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
print(s1.values) # [1 2 3 4 2 3]
print(s1.to_list()) # [1, 2, 3, 4, 2, 3]
print(type(s1.to_list())) # <class 'list'>
print("---------------------------")
print(s1.describe()) # 统计信息
print(s1.max()) # 获取series的元素最大值
print(s1.min) # 获取series的元素最小值
print(s1.mean) # 获取series的元素平均值
print(s1.median) # 获取series的元素中位数
print(s1.mode) # 获取series的元素众数
print(s1.std) # 获取series的元素标准差
print("---------------------------")
print(s1.drop_duplicates())# 删除重复的元素
print(s1.sort_values())# 排序,根据值排序,默认是升序
print(s1.sort_values())# 排序,根据值排序,默认是升序
print(s1.sort_values(ascending=False))# 排序,根据值排序,降序
print(s1.sort_index()) # 排序,根据索引排序,默认是升序
print(s1.sort_index(ascending=False)) # 排序,根据索引排序,降序
print(s1.unique()) # 去重
print(s1.value_counts()) # 统计每个元素出现的次数
- Series的布尔索引:需手动创建一组由列表组成的布尔值(布尔值的数量需要与Series对象元素数量一致,否则会报错),通过布尔值索引,获取True的值。
import pandas as pd
df = pd.read_csv('data/scientists.csv')
s = df['Age']
bool_list = [True, False, False, True, False, False, True, True]
print(s)
print(s[bool_list])
结果如图,上方为s列对象,下方为布尔索引结果。
- 布尔索引值的应用案例:筛选年龄大于平均年龄的科学家。
import pandas as pd
df = pd.read_csv('data/scientists.csv')
s = df['Age']
print(s[s > s.mean()])
可以看到,结果轻松筛选出了大于平均年龄的科学家。
-
Series的运算
- Series在与数值型变量计算时,变量会与Series中的每个元素逐一进行计算。
import pandas as pd df = pd.read_csv('data/scientists.csv') s = df['Age'] print(s + 1) """ 输出结果: s的输出: s + 1的输出: 0 37 0 38 1 61 1 62 2 90 2 91 3 66 3 67 4 56 4 57 5 45 5 46 6 41 6 42 7 77 7 78 """
- 两个Series之间计算,如果Series元素个数相同,则将两个Series对应元素进行计算。
import pandas as pd df = pd.read_csv('data/scientists.csv') s = df['Age'] print(s + s) """ 输出结果: s的输出: s + 1的输出: 0 37 0 74 1 61 1 122 2 90 2 180 3 66 3 132 4 56 4 112 5 45 5 90 6 41 6 82 7 77 7 154 """
- 元素个数不同的Series之间会根据索引值进行计算,索引值不同的元素最终计算结果被填充为NaN。
import pandas as pd df = pd.read_csv('data/scientists.csv') s = df['Age'] s1 = s.sort_values(ascending=False) print(s) print(s1) print(s + s1)
结果如下,s与s1的输出结果如图一所示,然而二者相加后的结果依旧是输出结果如图二所示。
DataFrame
DataFrame的创建
- 通过字典直接创建DataFrame对象
import pandas as pd
dict_data = {
'name':['张三','李四','王五'],
'age':[18,19,20],
'sex':['男','女','男']
}
df1 = pd.DataFrame(dict_data)
print(df1)
输出结果如图所示:
- 创建DataFrame的时指定列的顺序和行索引
import pandas as pd
dict_data = {
'name':['张三','李四','王五'],
'age':[18,19,20],
'sex':['男','女','男']
}
df2 = pd.DataFrame(dict_data, index=['a', 'b', 'c'])
print(df2)
输出结果如图所示:
- 通过pandas中的read_csv方法读取CSV文件
import pandas as pd
df = pd.read_csv("data/scientists.csv")
print(df)
输出结果如图所示:
DataFrame的常用操作
-
DataFrame的属性、方法、布尔索引和运算几乎与Series对象相同,此处就不做过多介绍
-
更改DataFrame索引
- 通过set_index()方法设置行索引名字。加载数据文件时,如果不指定行索引,Pandas会自动加上从0开始的索引
import pandas as pd df = pd.read_csv("../data/movie.csv") df.set_index('movie_title', inplace=True) print(df)
输出结果如下:
- 加载数据的时候,可以通过通过index_col参数,指定使用某一列数据作为行索引。
import pandas as pd df = pd.read_csv("../data/movie.csv", index_col='movie_title') print(df)
输出结果如图所示:
- 通过reset_index()方法可以重置索引
import pandas as pd df = pd.read_csv("../data/movie.csv", index_col='movie_title') df.reset_index(inplace=True) print(df)
输出结果如下:
-
修改DataFrame列名(修改行名与列名相同)。
- 通过rename()方法对原有的行索引名和列名进行修改。
import pandas as pd df = pd.read_csv("data/movie.csv", index_col='movie_title') print(df.index[:5]) # 输出前5行的索引值 index_list = {'Avatar' : '阿凡达', "Pirates of the Caribbean: At World's End" : '加勒比海盗'} df.rename(index = index_list, inplace=True) print(df.index[:5])
输出结果如下:
- 将index和columns属性提取出来重新赋值后再赋值给DataFrame对象。
import pandas as pd df = pd.read_csv("data/movie.csv", index_col='movie_title') index = df.index.to_list() # to_list()方法将索引值以列表形式输出 print(index[:5]) index[0] = '阿凡达' index[1] = '加勒比海盗' df.index = index print(index[:5])
输出结果如下:
-
添加/删除/插入列
- 通过dataframe[列名]=列值添加新列。
import pandas as pd df = pd.read_csv("data/movie.csv", index_col='movie_title') df['has_seen'] = 0 # 添加一个是否看过电影列,默认值为0 print(df.head())
输出结果如下:
- 调用drop方法删除列。
import pandas as pd df = pd.read_csv("data/movie.csv", index_col='movie_title') df['has_seen'] = 0 # 添加一个是否看过电影列,默认值为0 df.drop('has_seen', axis=1, inplace=True) # axis=1表示删除列,axis=0表示删除行
输出结果如下:
- 使用insert方法插入列。
import pandas as pd df = pd.read_csv("data/movie.csv", index_col='movie_title') df.insert(0, 'profit', df['gross'] - df['budget']) print(df.head())
输出结果如下:
数据的导入导出
pandas库的功能十分强大,其主要表现在pandas能读取各种格式的文件:
-
pickle文件:Python中的一个标准模块,用于实现数据的序列化和反序列化。它可以将Python对象转换为字节流(序列化),也可以将字节流转换回 Python 对象(反序列化)。
- 特点:
- Python 专用:Pickle 是 Python 特有的序列化格式。
- 支持多种对象:可以序列化大多数 Python 对象,包括自定义类实例。
- 二进制格式:Pickle 文件是二进制格式,不是人类可读的。
- 基本用法如图:
-
CSV(Comma-Separated Values,逗号分隔值)是一种简单的文本文件格式,用于存储表格数据(如电子表格或数据库数据)。
- 特点:
- 纯文本格式:人类可读,可以用文本编辑器直接查看和编辑。
- 通用性强:几乎所有数据处理工具和编程语言都支持。
- 结构简单:每行代表一条记录,字段间用分隔符(通常是逗号)隔开。
PS
:除了逗号,还可以使用其他类型的分隔符,比如TSV文件,使用制表符作为分隔符。- 基本用法如图:
-
Excel文件是由Microsoft Excel创建和使用的电子表格文件,是最常用的办公文档格式之一,用于存储、组织、计算和分析数据。
- 特点:
- 结构化数据存储:以工作簿(Workbook)和工作表(Worksheet)的形式组织数据。
- 多功能性:支持公式计算、图表、数据透视表等高级功能。
- 二进制和XML格式:传统为.xls(二进制),新版为.xlsx(基于XML的开放格式)
PS
:Series这种数据结构不支持to_excel方法,想保存成Excel文件,需要把Series转换成DataFrame。- 基本用法如图:
-
其它还有诸多格式,其导入导出方式基本与上述三种文件一致,就不做过多赘述,详细可以查看下表:
导出方法 说明 to_clipboard() 把数据保存在系统剪切版中,方便粘贴 to_dict 把数据转换成Python字典 to_hdf 把数据保存为HDF格式 to_html 把数据转换成HTML格式 to_json 把数据转换成JSON字符串 to_sql 把数据保存到SQL数据库
成DataFrame。
- 基本用法如图:[外链图片转存中…(img-Jv76ISVP-1755823433423)]
-
其它还有诸多格式,其导入导出方式基本与上述三种文件一致,就不做过多赘述,详细可以查看下表:
导出方法 说明 to_clipboard() 把数据保存在系统剪切版中,方便粘贴 to_dict 把数据转换成Python字典 to_hdf 把数据保存为HDF格式 to_html 把数据转换成HTML格式 to_json 把数据转换成JSON字符串 to_sql 把数据保存到SQL数据库