Pandas 入门

pandas入门-Series对象

导包

import numpy as np
import pandas as pd
import os
os.chdir(r'D:\Workspace\Work-20\numpyProject') #做个演示,选择更改路径

1.创建Series对象

1.1列表

# 2. 把上述的 ndarray => Series
s1 = pd.Series([1,2,3,5,6])
print(f's1的内容: {s1}')
print(f's1的类型: {type(s1)}')  # <class 'pandas.core.series.Series'>

1.2元组

# 演示 元组 => Series对象
s3 = pd.Series((10, 20, 30))
print(f's3的内容: {s3}')
print(f's3的类型: {type(s3)}')  # <class 'pandas.core.series.Series'>

1.3字典

# 演示 字典 => Series对象
s4 = pd.Series({'A': 1, 'B': 2, 'C': 3})
print(f's4的内容: {s4}')
print(f's4的类型: {type(s4)}')  # <class 'pandas.core.series.Series'>

1.4 创建Series对象,可加入索引列.

# 创建Series对象的时候, 加入: 索引. 
s5 = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print(f's5的内容: {s5}')
print(f's5的类型: {type(s5)}')  # <class 'pandas.core.series.Series'>

1.5 创建DaatFrame对象

1.5.1 通过字典构建
# 1. 定义字典, 记录: 数据.
my_dict = {
    'id': [1, 2, 3],
    'name': ['张三', '李四', '王五'],
    'age': [33, 29, 25]
}

# 2. 把上述的字段 => DataFrame对象
df1 = pd.DataFrame(my_dict)

# 3. 打印结果.
print(df1)
print(type(df1)) 
1.5.2 通过列表+元祖的方式构建
  • columns: 指定列的顺序.

  • index: 指定 索引列的值.

# 1. 定义列表, 记录: 数据.
my_list = [
    (1, '张三', 33),
    (2, '李四', 29),
    (3, '王五', 25)
]

# 2. 把上述的字段 => DataFrame对象
# columns: 指定列的顺序.
# index: 指定 索引列的值.
df3 = pd.DataFrame(data=my_list, columns=['id', 'name', 'age'], index=['X', 'Y', 'Z'])

# 3. 打印结果.
print(df3)
print(type(df3)) 

2.演示Series的常用属性

# 细节: 查看下当前的路径是哪里.
os.getcwd()
  • 读取数据时,加入index_col 可指定列为索引列
# 1. 读取文件数据, 获取DF对象.
df = pd.read_csv('./data/nobel_prizes.csv', index_col='id')
# 2. 打印数据的前10条数据.
df.head(10)       # 默认获取前10条数据.
# 2. 从df对象获取第一行数据, 充当Series对象.
# 方式1: 根据 索引列 获取.
first_row = df.loc[941]
print(first_row)
print(type(first_row))  # <class 'pandas.core.series.Series'>
# 方式2: 根据 行号 来获取.
first_row = df.iloc[0]
print(first_row)
print(type(first_row))  # <class 'pandas.core.series.Series'>
# 3. 演示Series的属性
print(first_row.shape)      # (7,),   维度
print(first_row.size)       # 7, 元素个数
print(first_row.dtype)      # Series的元素类型, object => 字符串
print(first_row.dtypes)     # 效果同上.

# 扩展: 演示 int 和 str的 "dtype"属性
print(first_row['year'])        # 从Series对象中, 获取: year列的值. 
print(first_row['year'].dtype)  # 从Series对象中, 获取: year列的值 的 数据类型: int64
# print(first_row['category'].dtype)  # 从Series对象中, 获取: category列的值 的 数据类型. 报错, 因为字符串没有dtype属性.


# index: 获取所有的 索引列(即: 列名)
print(first_row.index)
print(first_row.keys())  # 效果同上, 即: key()函数 效果 和 index属性效果 有一致.

# values: 获取所有的 值
print(first_row.values)

3.演示Series对象的常用方法

  • len()长度

  • head()默认获取前5条数据

  • tail() 默认后5条数据

  • keys()获取所有的列名

  • tolist()转换为列表

  • to_frame()转换为df对象

  • sort_values() 根据值排序

  • sort_index()根据索引列排序

# 1. 创建Series对象.
s1 = pd.Series(data=[1, 2, 3, 4, 2, 3], index=['A', 'B', 'C', 'D', 'E', 'F'])
print(s1)
# 2. 演示Series对象的常用方法.
print(len(s1))      # 获取长度, 6
print(s1.head())    # 获取前5条数据
print(s1.head(n=2)) # 获取前2条数据

print(s1.tail())    # 获取后5条数据
print(s1.tail(n=3)) # 获取后3条数据

print(s1.keys())    # 获取所有的列名

print(s1.tolist())  # Series => list列表
print(s1.to_list()) # 效果同上
print(s1.to_frame())# Series => DataFrame对象.

print(s1.drop_duplicates()) # 去重, 返回 => Series对象
print(s1.unique())          # 去重, 返回 => list列表

print(s1.sort_values())                 # 根据值排序, 默认: 升序, ascending = True
print(s1.sort_values(ascending=False))  # 根据值排序, ascending=False => 降序

print(s1.sort_index(ascending=False))   # 根据索引排序 

  • mean()平均值

  • max()最大值

  • min()最小值

  • sum() 求和

  • count()统计该列非空值的个数

  • sta()标准差

  • value_counts()统计每个元素的个数

  • info() 基本信息

  • describle() 统计详细信息

# 平均值, 最大值, 最小值, 求和, 标准差...
print(s1.mean())        # 2.5 平均值
print(s1.max())
print(s1.min())
print(s1.sum())
print(s1.count())       # 统计该列的 非空值的个数.
print(s1.std())         # 标准差

# 统计每个元素的个数
print(s1.value_counts())     # 类似于SQL语句: select 性别, count(id) from 表名 group by 性别;

# 查看Series列的详细信息.
print(s1.describe())

4.小案例-演示Series的常用函数

# 1. 加载电影数据, 获取df对象.
df = pd.read_csv('data/movie.csv')
df.head()
# 2. 获取所有的列.
print(df.columns)
# 3. 获取导演的名字
# director = df['director_name']
director = df.director_name     # 效果同上
print(director)
# 4. 获取主演的 脸书点赞数.
actor1_fb = df.actor_1_facebook_likes
actor1_fb.head()
# 5. 统计不同导演 指导的电影数量, 即: 每个导演名出现了多少次. 
df.director_name.value_counts()
# 6. 查看主演的脸书点赞数, 即: 1000点赞的有几个人, 2000点赞的有几个人...
actor1_fb.value_counts()
# 7. 打印描述信息.
director.describe()     # 字符串不是数值, 所以统计信息相对较少.
actor1_fb.describe()    # 数值的统计信息较多.

# 统计(电影总数)全量
df.shape        # (4916, 28)

# 统计非空导演总数
df.director_name.count()    # 4814

6.演示Series的布尔索引

# 细节: True => 要,  False => 不要.
# 1. 读取数据, 获取df对象
df = pd.read_csv('data/scientists.csv')
df
# 2.查看每列的详细信息
df.describe()   # 统计信息
df.info()       # 详细信息
# 3. 从df对象中 => 获取 Series 对象
series_age = df.Age
series_age
# 4. 演示Series对象的 布尔索引
bool_list = [True, False, False, True, True, False, False, True]
print(series_age[bool_list])
# 5. 筛选年龄大于平均年龄的科学家.
# 5.1 获取平均年龄
avg_mean = series_age.mean()
print(avg_mean)     # 59.125
# 5.2 看看当前年龄 是否大于 平均年龄
bool_list = series_age > avg_mean
print(bool_list)        # [False, True, True, True, False, False, False, True]
# 5.3 获取 年龄大于平均年龄的科学家
print(series_age[series_age > avg_mean])
# 6. 上述代码优化版, 一行搞定.
# 补充: df['列名'] 和 df.列名  都可以从df中获取到指定的 列.
# print(df.Age[df.Age > df.Age.mean()])
print(df['Age'][df['Age'] > df['Age'].mean()])

7.Series的运算

  • 场景1: Series对象 和 数值运算, 则数值会和 Series对象的每个值进行具体的运算.
s1 = pd.Series([1,2,3,4,5,6])
s1
s1 + 100
s1*2
  • 场景2: Series对象 和 Series对象运算, 会优先参考 索引列运算, 即: 索引值相同的进行计算, 不同的用NAN(空值)填充.
s1 + s1
s1.sort_index(ascending=False) + s1
s1 + pd.Series([1, 2, 3])
s1 + pd.Series([1, 2, 3], index=['a', 'b', 'c'])

pandas入门-DataFrame

导包

import numpy as np
import pandas as pd
import os

1.DataFrame的常用属性

#1.读取文件,获取df对象
df = pd.read_csv('data/scientists.csv')
df
# 2.演示df对象常用属性
print(df.shape)  #维度
print(df.size)  #元素个数
print(df.values) #所有元素的值
print(type(df.values)
print(df.dtypes) #元素类型
print(df.ndim) #维度 
print(df.index)  # 获取所有索引值
print(df.columns) # 获取所有列名

2.DataFrame的常用方法

  • head() 默认读取前五行
  • tail() 默认读取后五行
#演示df对象的常用方法
print(len(df)) #行数
print(df.head()) # 默认为前五行
print(df.head(n=2))  # 前2行
print(df.tail())  # 默认是后5行
print(df.tail(n=2))  # 后2行
  • info() 查看各列的基本信息, 包括: 列名, 列元素个数, 列元素类型
  • describle()查看各列的统计信息(默认只显示 数值列相关), 包括: 平均值, 方差, 最大值, 最小值等
print(df.info())  
print(df.describe())  
print(df.describe(include='all'))  # 查看各列的统计信息, 所有列. 
print(df.describe(exclude=['int', 'float']))  # # 查看各列的统计信息, 不包含int, float类型的列
  • count()统计非空值
  • max()查看各列的最大值
  • min()查看各列的最小值
print(df.count())  # 查看各列的非空值总数
print(df.max())  # 查看各列的最大值
print(df.min())  # 查看各列的最小值
# print(df.mean())     # 查看数值列的平均值, 针对于旧版本Anaconda(例如: 2020版)有效. 新版本不支持.
print(df.Age.mean())

3.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]]  # 传入的是 布尔列表.

4.DataFrame对象的计算

  • 细节: 和Series对象一样, df计算也是分两种情况:

    1. 和数值运算的时候, 数值会和df对象的每个值进行计算.
    1. 和新的df计算的时候, 会优先参考索引, 对应索引进行计算, 不匹配就返回NAN.
# 场景1: df 和 数值计算.
df * 2
# 场景2: df 和 df计算
df + df

df + df[:4]  # 类似于Python的切片, 即: 获取前4行, 索引为: 0 ~ 4 包左不包右

5.更改Series和DataFrame对象

5.1 设置和取消索引

  • 细节: Pandas中, 某个函数如果有 inplace参数, 则该函数99%以上的概率是 默认返回新副本, 把 inplace 设置为True, 则直接修改原对象.
# 场景1: 读取数据, 不设置索引列, 读取数据完毕后, 设置索引列. 
# 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()
movie.set_index('movie_title',inplace = True) #在原有对象上直接修改
# 3. 查看设置后的内容.
movie.head()
# 场景2: 读取数据时, 直接设置索引列.
movie = pd.read_csv('data/movie.csv', index_col='movie_title')
movie.head()
# 场景3: 重置索引列.
movie.reset_index(inplace = True)
movie.head()

5.2 修改行名和列名

  • 思路1:rename()函数实现
# 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)
# 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.tolist()

# 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()

5.3添加,删除,插入列

  • 添加列-会默认在表的最后一列添加

  • 格式:df对象[列名] = 值

# 1. 读取数据, 获取df对象
# df = pd.read_csv('data/movie.csv', index_col='movie_title')
df = pd.read_csv('data/movie.csv')
df.head()
# 2. 添加列.  
# 是否看过这个电影, 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])      # 根据 索引列值 删除该行.
# 2. 查看处理后的结果.
df.head()

总结

持续更新中~~~

Pandas是一种基于NumPy的数据分析工具,它可以帮助我们对数据进行清洗、编辑和分析等工作。掌握Pandas的常规用法是构建机器学习模型的第一步。首先,我们需要安装Pandas。如果已经安装了Anaconda,可以直接使用Anaconda自带的包管理工具来安装Pandas。如果没有安装Anaconda,可以使用Python自带的包管理工具pip来安装Pandas,命令为pip install pandas。安装完成后,我们可以导入Pandas库并查询相应的版本信息。通常,我们还会导入NumPy库,因为Pandas和NumPy常常结合在一起使用。导入Pandas库的命令为import pandas as pd,导入NumPy库的命令为import numpy as np。要查询Pandas的版本信息,可以使用print(pd.__version__)命令。接下来,我们可以学习Pandas的数据类型,包括Series和DataFrame。Series是一种一维的数据结构,类似于数组或列表,而DataFrame是一种二维的数据结构,类似于表格。在学习Pandas的过程中,我们可以通过导入Excel数据、输出Excel数据、数据概览、数据查看、数据清洗、数据选择、数据排序、数据分组、数据透视、数据合并和数据可视化等操作来熟悉Pandas的用法。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [非常全面的Pandas入门教程](https://blog.csdn.net/weixin_44489066/article/details/89494395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [pandas 快速入门教程](https://blog.csdn.net/down_12345/article/details/105345429)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值