创建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对象
























