数据处理与统计分析篇-day05-Pandas详解

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值