创建DaraFrame对象
概述
-
DataFrame是一个表格型的==结构化==数据结构,它含有一组或多组有序的列(Series),每列可以是不同的值类型(数值、字符串、布尔值等)。
-
DataFrame是Pandas中的最基本的数据结构对象,简称df;可以认为df就是一个二维数据表,这个表有行有列有索引
-
DataFrame是Pandas中最基本的数据结构,Series的许多属性和方法在DataFrame中也一样适用.
创建方式
字典方式创建
# 定义字典, 记录: 数据 my_dict = { 'id': [1, 2, 3], 'name': ['张三', '李四', '王五'], 'age': [23, 21, 25] } # 将字典 => DataFrame对象 df1 = pd.DataFrame(my_dict) print(df1) print(type(df1)) # <class 'pandas.core.frame.DataFrame'>
列表+元组方式创建
# 定义列表, 记录: 数据 my_list = [ (1, '张三', 23), # 列表内嵌套的(元组或列表)是一行数据 (2, '李四', 1), (3, '王五', 25) ] # 将列表 => DataFrame对象 # columns: 指定列的顺序 # index: 指定索引的值 df3 = pd.DataFrame( data=my_list, columns=['id', 'name', 'age'], index=['x', 'y', 'z'] ) print(df3) print(type(df3)) # <class 'pandas.core.frame.DataFrame'>
index与columns属性
# 定义字典, 记录: 数据 my_dict = { 'id': [1, 2, 3], 'name': ['张三', '李四', '王五'], 'age': [23, 21, 25] } # 将字典 => DataFrame对象 # columns: 指定列的顺序 # index: 指定索引的值 df2 = pd.DataFrame( data=my_dict, columns=['name', 'id', 'age'], index=['x', 'y', 'z'] ) print(df2) print(type(df2)) # <class 'pandas.core.frame.DataFrame'>
属性
# 读取文件, 获取df对象 df = pd.read_csv('data/scientists.csv') df print(df.shape) # 维度(8, 5) print(df.size) # 元素个数 print(df.values) # df对象 => ndarray print(type(df.values)) # <class 'numpy.ndarray'> print(df.dtypes) # 各列元素的类型 print(df.ndim) # 维度, 2 print(df.index) # 获取所有的索引列(的值) print(df.columns) # 列名
函数
print(len(df)) # 8, 行数 print(df.head()) # 默认前5行 print(df.head(n=2)) # 前2行 print(df.tail()) # 默认最后5行 print(df.tail(n=2)) # 后2行 df.info() # 查看详细信息 print(df.describe()) # 查看格列的统计信息(默认只查看数值列) print(df.describe(include='all')) # 查看格列的统计信息(查看所有列) print(df.describe(include=['int', 'float']))# 查看整型和浮点型 print(df.count()) # 查看各列非空值 print(df.max()) # 查看各列最大值 print(df.min()) # 查看各列最小值 # print(df.mean()) # 报错, 只针对2020版conda环境有效(平均) print(df.Age.mean())
布尔索引
# 过滤出df对象中, Age列大于平均年龄的行 # df[Age列 > Age列的平均值] print(df.Age.mean()) # df[df.Age > df.Age.mean()] # df对象的布尔值操作 df.Age[df.Age > df.Age.mean()] # Series对象的布尔值操作 # 过滤出前5行中的, 第1, 3, 4行 => 索引:0, 2, 3 df.head()[[True, False, True, True, False]] # 传入的是布尔列表
计算
# 场景1: df和数值计算(数值会和df对象的每个元素计算) df * 2 # 场景2: df和df对象计算(优先参考索引) df + df df[:4] # 类似切片, 获取前4行 df + df[:4]
索引和列名相关操作
设置和取消索引列
Pandas中99%关于DF和Series调整的API, 都会默认在副本上进行修改, 调用修改的方法后, 会把这个副本返回
这类API都有一个共同的参数: inplace, 默认值是False
如果把inplace的值改为True, 就会直接修改原来的数据, 此时这个方法就没有返回值了
# 在pandas中, 某个函数如果有 inplace参数, 则该函数大概率 是默认返回新的副本, 把该参数设置为true, 则在原始对象中修改 # 1. 演示读完设置索引列 movie = pd.read_csv('data/movie.csv') movie.head() # 设置 movie_title为索引列(分步) movie.set_index('movie_title') # 默认返回新的副本 movie.head() new_movie = movie.set_index('movie_title') # 默认返回新的副本 new_movie.head() movie.set_index('movie_title', inplace=True) # 在原始对象中修改 movie.head() # 多次运行会报错 "None of ['movie_title'] are in the columns" # 2. 演示读时设置索引列 movie = pd.read_csv('data/movie.csv', index_col='movie_title') movie.head() # 3. 重置索引列 movie.reset_index(inplace=True) movie.head()
修改列名和行名
rename()
df = pd.read_csv('data/movie.csv', index_col='movie_title') df.head() # 手动设置行名(索引列) 和 列名 idx_name = {'Avatar':'阿凡达', "Pirates of the Caribbean: At World's End":'加勒比'} col_name = {'color':'颜色', 'director_name':'导演名'} # 通过rename函数, 修改行名和列名 df.rename(index=idx_name, columns=col_name, inplace=True) df.head()
index和columns属性
df = pd.read_csv('data/movie.csv', index_col='movie_title') df.head() # 获取所有行名 和 列名 idx_list = df.index.to_list() col_list = df.columns.to_list() # 修改行名和列名 # 索引列 idx_list[0] = '阿凡达' idx_list[1] = '加勒比' # 列名 col_list[0] = '颜色' col_list[1] = '导演名' # 把修改后的行名和列名设置为新的索引列 和 列名 df.index = idx_list df.columns = col_list df.head()
添加列
末尾添加
# df = pd.read_csv('data/movie.csv', index_col='movie_title') df = pd.read_csv('data/movie.csv') df.head() #%% # 1. 添加列: df对象[列名] = 值 df['has_seen'] = 1 # 总点赞数 = 导演点赞数 + 演员的点赞数 df['daafl'] = df['director_facebook_likes'] + df['actor_1_facebook_likes'] + df['actor_2_facebook_likes'] df.head()
指定位置插入
# 在索引为1的位置, 插入1列, 总利润 = 总收入 - 总预算 # insert()函数在原对象中修改 df.insert(loc=1, column='profix', value=df['gross'] - df['budget']) df.head()
删除列
# df.drop('has_seen', inplace=True, axis='columns') df.head().drop([0, 1]) # [索引值列表]
进阶-获取指定的数据
导出
# 细节: 如果使用Excel文件, 记得先装3个包, xlwt, openyxl, xlrd # 1. 读取文件, 获取df对象. df = pd.read_csv('data/scientists.csv') df #%% # 2. 演示导出数据到文件中. # 要求: 导出文件到 当前项目下的 output 文件夹下. # 导出的格式: df.to_文件格式() # 前提: output文件夹必须存在. df.to_pickle('output/scientists.pickle') # pickle文件 一般用于存储 pandas的 中间结果. df.to_csv('output/scientists.csv') # 细节: 索引列也会导出 df.to_csv('output/scientists_noindex.csv', index=False) # 细节: 不导出索引列 df.to_csv('output/scientists_noindex.tsv', index=False, sep='\t') # sep: 分隔符 df.to_excel('output/scientists.xlsx') df.to_excel('output/scientists_noindex.xlsx', index=False, sheet_name='ai21') print('导出成功!')
导入
# 1. 读取文件, 获取df对象 # df = pd.read_pickle('output/scientists.pickle') # df = pd.read_csv('output/scientists.csv') # df = pd.read_csv('output/scientists_noindex.csv') # df = pd.read_csv('output/scientists_noindex.tsv', sep='\t') # 读取tsv的时候, 指定分隔符 # df = pd.read_excel('output/scientists.xlsx') # 如果不写表名, 则默认读取第1个表, 如果写了, 则读取指定的表. 可以是一张表, 也可以是多张表. # 1张表的情况下, 返回的是: df对象. # 多张表的情况下, 返回的是: 字典, 即: 表名做键, 该表的df对象做值. df = pd.read_excel('output/scientists_noindex.xlsx', sheet_name=['pandas_dara', 'Sheet1']) #%% # 2. 查看结果 df # 字典 df['Sheet1'] # df对象