pd.DataFrame()
pandas.DataFrame()
方法是用于创建一个 Pandas DataFrame 的函数。DataFrame 是 Pandas 中的核心数据结构,类似于 Excel 中的二维表格。它由行和列组成,列通常是不同的数据类型。
语法:
pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
参数:
- data: 数据,用于填充 DataFrame 的内容。可以是多种类型,如字典、列表、NumPy 数组、另一个 DataFrame 等。
- index: 索引(行标签)。如果不指定,默认会自动生成从 0 开始的整数索引。
- columns: 列标签。可以指定列的名称,如果不指定,将从数据推断。
- dtype: 每列的数据类型。可选参数,如果不指定,Pandas 会自动推断数据类型。
- copy: 布尔值,默认为 False。如果设置为 True,数据将被复制,即使提供的数据是 DataFrame。
(1) DataFrame的常用属性和方法
import pandas as pd# 加载数据集, 得到df对象
df = pd.read_csv('data/scientists.csv')print('=============== 常用属性 ===============')
print(df.shape) # 查看维度, 返回元组类型 -> (行数, 列数), 元素个数代表维度数
print(df.size) # 查看数据值个数, 行数*列数, NaN值也算
print(df.values) # 查看数据值, 返回numpy的ndarray类型
print(df.ndim) # 查看维度数(8, 5)
print(df.dtypes) # 返回列名和列数据类型
print(df.index) # 查看索引值, 返回索引值对象
print(df.columns) # 查看列名, 返回列名对象print('=============== 常用方法 ===============')
print(df.head()) # 查看前5行数据
print(df.tail()) # 查看后5行数据
df.info() # 查看各列的基本信息. 包括: 列名, 列元素个数, 列元素类型
print(df.describe()) # 查看df对象中所有数值列的描述统计信息
print(df.describe(exclude=['int', 'float'])) # exclude:不包含指定类型列
print(df.describe(include='all')) # include:包含指定类型列, all代表所有类型
print(len(df)) # 查看df的行数
print(df.min()) # 查看df各列的最小值
print(df.count()) # 查看df各列的非空值个数
print(df.mean()) # 查看df数值列的平均值
(2) DataFrame对象的布尔索引
# 细节: df对象和Series对象一样, 也是支持布尔操作的.
# 需求: 过滤出df对象中, Age列大于平均年龄的数据行
df[df.Age > df.Age.mean()] # df对象的布尔值操作.
df.Age[df.Age > df.Age.mean()] # Series对象的布尔值操作.# 需求: 过滤出df对象前5行中的 第1, 3, 4行 => 索引是: 0, 2, 3
df.head()[[True, False, True, True, False]] # 传入的是 布尔列表.
(3) DataFrame对象的计算
# 细节: 和Series对象一样, df计算也是分两种情况:
# 1. 和数值运算的时候, 数值会和df对象的每个值进行计算.
# 2. 和新的df计算的时候, 会优先参考索引, 对应索引进行计算, 不匹配就返回NAN.# 场景1: df 和 数值计算.
df * 2 # 每个元素, 分别和数值运算# 场景2: df 和 df计算
df + df # 根据索引进行对应运算df + df[:4] # 类似于Python的切片, 即: 获取前4行, 索引为: 0 ~ 4 包左不包右, 索引不匹配, 返回NAN
(4) DataFrame-索引操作
Pandas中99%关于DF和Series调整的API, 都会默认在副本上进行修改, 调用修改的方法后, 会把这个副本返回
这类API都有一个共同的参数: inplace, 默认值是False
`如果把inplace的值改为True, 就会直接修改原来的数据, 此时这个方法就没有返回值了
-
设置和取消索引
# todo 细节: 在Pandas中, 某个函数如果有 inplace参数, 则该函数 99%的概率是 默认False返回新副本, 设置为True则直接修改原数据 # 场景一: 数据读取完毕后 设置索引 # 1. 读取数据, 获取df对象. movie = pd.read_csv('./data/movie.csv') movie.head() #%% # 2. 设置 movie_title列为索引列 new_movie = movie.set_index('movie_title') # 默认 inplace=False 返回新副本 new_movie.head()# 3. 查看设置后的内容. # movie.set_index('movie_title', inplace=True) # 在 原df对象上直接修改 # movie.head() #%% # 场景2: 读取数据时, 直接设置索引列. movie = pd.read_csv('data/movie.csv', index_col='movie_title') movie.head() #%% # 场景3: 重置索引列. movie.reset_index(inplace=True)
(5) 更改 Series 和 DataFrame 对象
-
修改行名和列名
---------------------------1. renanme()函数实现--------------------------- # 1. 获取 df对象 并指定索引列 df = pd.read_csv('data/movie.csv', index_col='movie_title') df.head() #%% # 2. 手动修改 行名(索引列值)和列名 # 索引列值 idx_name = {'Avatar': '阿凡达', "Pirates of the Caribbean: At World's End": '加勒比海盗'} # 列名 col_name = {'color': '颜色', 'director_name': '导演名'}# 3. 通过 rename()函数, 修改 行名和列名 df.rename(index=idx_name, columns=col_name, inplace=True) df.head() #%% # 4. 查看修改后的结果. df.head()----------------------2. 读取所有的行名 列名, 修改后重新设置给df对象---------------------- # 1. 读取数据, 获取 df对象 并设置 索引列 df = pd.read_csv('data/movie.csv', index_col='movie_title') df.head() #%% # 2. 获取所有的 索引列值 和 列名 idx_list = df.index.to_list() col_list = df.columns.to_list() # col_list[0: 5]# 3. 修改 索引列值 和 列名 # 修改 索引列值 idx_list[0] = '阿凡达' idx_list[1] = '加勒比海盗'# 列名 col_list[0] = '颜色' col_list[1] = '导演名'# 4. 把修改后的 行名 和 列名, 设置为新的: 索引列 和 列名即可. df.index = idx_list df.columns = col_list# 5. 查看修改后的结果. df.head()
-
添加 删除 插入 列
----------------------------添加列---------------------------- # 1. 读取数据, 获取df对象 # df = pd.read_csv('data/movie.csv', index_col='movie_title') df = pd.read_csv('data/movie.csv') df.head() #%% # todo 2. 添加列: df对象[列名] = 值 # 是否看过这个电影, 0 => 没看过, 1 => 看过 df['has_seen'] = 1# 添加1列, 表示电影总的 脸书点赞数, 总点赞数 = 导演的脸书点赞数 + 演员的点赞数 df['director_actor_all_facebook_likes'] = df['director_facebook_likes'] + df['actor_1_facebook_likes'] + df['actor_2_facebook_likes'] + df['actor_3_facebook_likes'] # 3. 查看添加后的内容. df.head()----------------------------插入列---------------------------- # 1. 在索引为1的地方插入1列, 总利润 = 总收入 - 总预算 df.insert(loc=1, column='profix', value=df['gross'] - df['budget']) # insert() 是直接在原对象上修改 # 2. 查看处理后的结果. df.head()----------------------------删除列---------------------------- # 1. 演示删除列 # df.drop('has_seen', inplace=True, axis='columns') # df.drop('imdb_score', inplace=True, axis='columns') # df.head().drop(['Avatar', "Pirates of the Caribbean: At World's End"]) df.head().drop([0, 1]) # 根据 索引列值 删除该行.(删除列索引值为 0和1 的)
(6) 导入 和 导出数据
-
导入数据
# todo 细节: 如果使用Excel文件, 记得先装3个包, xlwt, openyxl, xlrd# 1. 读取文件, 获取df对象. df = pd.read_csv('data/scientists.csv') df #%% # 2. 演示导出数据到文件中. # 要求: 导出文件到 当前项目下的 output 文件夹下. # 导出的格式: df.to_文件格式()# 前提: output文件夹必须存在. df.to_pickle('data/output/scientists.pickle') # pickle文件 一般用于存储 pandas的 中间结果. df.to_csv('data/output/scientists.csv') # 细节: 索引列也会导出 df.to_csv('data/output/scientists_noindex.csv', index=False) # 细节: 不导出索引列 df.to_csv('data/output/scientists_noindex.tsv', index=False, sep='\t') # sep: 分隔符df.to_excel('data/output/scientists.xlsx') df.to_excel('data/output/scientists_noindex.xlsx', index=False, sheet_name='ai21') print('导出成功!')
-
导入数据
# 1. 读取文件, 获取df对象 # df = pd.read_pickle('data/output/scientists.pickle')# df = pd.read_csv('data/output/scientists.csv') # df = pd.read_csv('data/output/scientists_noindex.csv') # df = pd.read_csv('data/output/scientists_noindex.tsv', sep='\t') # 读取tsv的时候, 指定分隔符# df = pd.read_excel('data/output/scientists.xlsx')# 如果不写表名, 则默认读取第1个表, 如果写了, 则读取指定的表. 可以是一张表, 也可以是多张表. # 1张表的情况下, 返回的是: df对象. # 多张表的情况下, 返回的是: 字典, 即: 表名做键, 该表的df对象做值. # df = pd.read_excel('data/output/scientists_noindex.xlsx', sheet_name=['ai21', 'ai22']) # 2. 查看结果 df # 字典 df['ai22'] # df对象