Python 数据分析:Pandas DataFrame 零基础入门教程

文章目录

  • [一、DataFrame 简介](#一、DataFrame 简介)
  • [二、DataFrame 基本语法](#二、DataFrame 基本语法)
    • [2.1 DataFrame 的创建](#2.1 DataFrame 的创建)
    • [2.2 DataFrame 的属性](#2.2 DataFrame 的属性)
    • [2.3 DataFrame 数据访问](#2.3 DataFrame 数据访问)
  • [三、DataFrame 常用函数](#三、DataFrame 常用函数)
  • [四、DataFrame 案例](#四、DataFrame 案例)

一、DataFrame 简介

  DataFrame 是 Pandas 最核心的 二维表格型数据结构,由行索引 (index)、列名 (columns) 和值组成。可理解成多张 Series 共用一套行索引拼接而成,类似 Excel 表格。特点如下:

  1. 二维结构,有行、列两个维度标签
  2. 每一列可以是不同数据类型(数值、字符串等)
  3. 支持快速筛选、分组、聚合、缺失值处理
  4. 可以从字典、列表、Series、csv 等多种来源创建

注:DataFrame 的每一列本质上就是一个 Series;后文演示默认引入 Pandas:import pandas as pd


二、DataFrame 基本语法

2.1 DataFrame 的创建

通过series创建:

python 复制代码
s1 = pd.Series([1, 2, 3, 4, 5])
s2 = pd.Series([6, 7, 8, 9, 10])
df = pd.DataFrame({'第一列': s1, '第二列': s2})

通过列表创建:

python 复制代码
data_list = [
    [101, "Alice", 1200],
    [102, "Bob", 300],
    [103, "Charlie", 800]
]
df = pd.DataFrame(data_list, columns=["用户ID", "姓名", "金额"])

通过字典创建:

python 复制代码
df = pd.DataFrame({
    "id": [1, 2, 3, 4, 5],
    "name": ["tom", "jack", "alice", "bob", "allen"],
    "age": [14, 15, 16, 17, 13],
    "score": [10.1, 20.2, 30.2, 40.0, 50]
})
df = pd.DataFrame(
    {
        "name": ["tom", "jack", "alice", "bob", "allen"],
        "age": [14, 15, 16, 17, 13],
        "score": [10.1, 20.2, 30.2, 40.0, 50]
    },
    index=[1, 2, 3, 4, 5]
)
df = pd.DataFrame(
    {
        "name": ["tom", "jack", "alice", "bob", "allen"],
        "age": [14, 15, 16, 17, 13],
        "score": [10.1, 20.2, 30.2, 40.0, 50]
    },
    index=[1, 2, 3, 4, 5],
    columns=["name", "score", "age"]  # 通过columns修改列的位置
)

2.2 DataFrame 的属性

属性 说明 属性 说明
index DataFrame的行索引 loc[] 显式索引,按行列标签索引或切片
values DataFrame的值 iloc[] 隐式索引,按行列位置索引或切片
dtypes DataFrame的元素类型 at[] 使用行列标签访问单个元素
shape DataFrame的形状 iat[] 使用行列位置访问单个元素
ndim DataFrame的维度 T 行列转置
size DataFrame的元素个数
columns DataFrame的列标签

示例代码1:

python 复制代码
df = pd.DataFrame(
    {
        "name": ["tom", "jack", "alice", "bob", "allen"],
        "age": [14, 15, 16, 17, 13],
        "score": [10.1, 20.2, 30.2, 40.0, 50]
    },
    index=[1, 2, 3, 4, 5],
    columns=["name", "score", "age"]  # 通过columns修改列的位置
)

print('行索引:', df.index)    # Index([1, 2, 3, 4, 5], dtype='int64')
print('列标签:', df.columns)  # Index(['name', 'score', 'age'], dtype='str')
print('值:', df.values)
# [['tom' 10.1 14]
#  ['jack' 20.2 15]
#  ['alice' 30.2 16]
#  ['bob' 40.0 17]
#  ['allen' 50.0 13]]

print('维度:', df.ndim)        # 2
print('形状:', df.shape)       # (5, 3)
print('元素个数:', df.size)    # 15
print('数据类型:', df.dtypes)  # dtype: object
# name         str
# score    float64
# age        int64

print('转置:', df.T)
print('转置后的行索引:', df.T.index)    # Index(['name', 'score', 'age'], dtype='str')
print('转置后的列表签:', df.T.columns)  # Index([1, 2, 3, 4, 5], dtype='int64')

代码示例2:

python 复制代码
# 获取行
print(df.loc[4])  # 显式
# name      bob
# score    40.0
# age        17
# Name: 4, dtype: object
print(df.iloc[3])  # 隐式,同上

# 获取列
print(df.loc[:, 'name'])  # 显示
# 1      tom
# 2     jack
# 3    alice
# 4      bob
# 5    allen
print(df.iloc[:, 0])  # 隐式,同上

代码示例3:

python 复制代码
# 单个元素
print(df.at[3, 'score'])  # 显式 30.2
print(df.iat[2, 1])       # 隐式
print(df.loc[3, 'score']) # 显式
print(df.iloc[2, 1])	  # 隐式

代码示例4:

python 复制代码
# 获取某列 扩展
print(df['name'])
# 1      tom
# 2     jack
# 3    alice
# 4      bob
# 5    allen
# Name: name, dtype: str

print(type(df['name']))    # <class 'pandas.Series'>
print(df.name)
print(type(df.name))       # <class 'pandas.Series'>
print(df[['name']])
print(type(df[['name']]))  # <class 'pandas.DataFrame'>
# 获取多列
print(df[['name', 'score']])

注:df['name'] / df.name:单层方括号,取一列,返回 Series(一维);

  df[['name']]双层方括号,传入列名列表,返回 DataFrame(二维表格)


2.3 DataFrame 数据访问

python 复制代码
# 查看部分数据
print(df.head())  # 默认前5行
#     name  score  age
# 1    tom   10.1   14
# 2   jack   20.2   15
# 3  alice   30.2   16
# 4    bob   40.0   17
# 5  allen   50.0   13

print(df.tail())  # 默认后5行
print(df.head(1))  # 前1行
print(df.tail(2))  # 后2行

# 使用布尔索引筛选
print(df[df.score > 30])  
print(df[(df.score > 30) & (df.age > 16)])
print(df[(df['score'] > 30) & (df['age'] > 16)])

# 随机抽样
print(df.sample())
print(df.sample(3))  # 随机取三条

注:df[布尔序列]:筛选出符合布尔序列对应的全部行


三、DataFrame 常用函数

方法 说明 方法 说明
head() 查看前 n 行数据,默认 5 行 max() 最大值
tail() 查看后 n 行数据,默认 5 行 var() 方差
isin() 判断元素是否包含在参数集合中 std() 标准差
isna() 判断是否为缺失值(如 NaN 或 None) median() 中位数
sum() 求和,自动忽略缺失值 mode() 众数(可返回多个)
mean() 平均值 quantile(q) 分位数,q 取 0~1 之间
min() 最小值 describe() 常见统计信息(count、mean、std、min、25%、50%、75%、max)

示例代码1:

python 复制代码
df = pd.DataFrame(
    {
        "name": ["tom", "jack", "alice", "bob", "allen"],
        "age": [14, 15, 16, 17, 13],
        "score": [10.1, 20.2, 30.2, 40.0, 50]
    },
    index=[1, 2, 3, 4, 5],
    columns=["name", "score", "age"]  # 通过columns修改列的位置
)

print(df.head())  # 查看前 n 行数据,默认 5 行
print(df.tail())
print(df.head(1))
print(df.tail(2))

print(df.isin(['jack', 17]))  # 查看 jack 和 17 元素是否包含在参数集合中
print(df.isna())  # 判断是否为缺失值

print(df['score'].sum())  # 某一列的总和
print(df.score.max())     # 最大值
print(df.score.min())     # 最小值
print(df.score.mean())    # 平均值
print(df.score.median())  # 中位数
print(df.mode())          # 众数
print(df.score.std())     # 标准差
print(df.score.var())     # 方差
print(df.score.quantile(0.25))  # 分位数
print(df.describe())      # 描述性信息

方法 说明 方法 说明
value_counts() 每个唯一值的出现次数 sort_values() 按值排序
count() 非缺失值数量 replace() 替换值
duplicated() 是否重复 nlargest() 返回某列最大的n条数据
drop_duplicates() 去除重复项 nsmallest() 返回某列最小的n条数据
sample() 随机抽样 cumsum() 返回累计和
replace() 替换值 cummax() 返回累计最大值
sort_index() 按索引排序 cummin() 返回累计最小值
python 复制代码
df = pd.DataFrame(
    {
        "name": ["tom", "tom", "alice", "bob", "allen"],
        "age": [14, 14, 16, 17, 13],
        "score": [10.1, 10.1, 30.2, 40.0, 50]
    },
    index=[1, 2, 3, 4, 5],
    columns=["name", "score", "age"]  # 通过columns修改列的位置
)

示例代码2:

python 复制代码
print(df.count())  # 统计出现非缺失值的次数
print(df.score.count())
print(df.value_counts())  # 统计出现的次数
# name   score  age
# tom    10.1   14     2
# alice  30.2   16     1
# bob    40.0   17     1
# allen  50.0   13     1
# Name: count, dtype: int64

print(df.drop_duplicates())  # 去重
#     name  score  age
# 1    tom   10.1   14
# 3  alice   30.2   16
# 4    bob   40.0   17
# 5  allen   50.0   13

print(df.duplicated())  # 检查是否重复
# 1    False
# 2     True
# 3    False
# 4    False
# 5    False
# dtype: bool
print(df.duplicated(subset=['score']))  # 只检查某一列是否重复,结果同上
print(df.sample(2))  # 随机采样
print(df.replace(17, 777))  # 替换值

示例代码3:

python 复制代码
print(df.sort_index(ascending=False))  # 按照索引排序
print(df.sort_values(by='name', ascending=False))  # 按照值排序
print(df.sort_values(by='score', ascending=False))

# 按照score和age两个维度排序
# 后面设置 ascending=False 表示:先按照score降序,如果score相同,则age降序
print(df.sort_values(by=['score', 'age'], ascending=False))

# 按照score和age两个维度排序
# 后面设置 ascending=[True, False] 表示:先按照score升序,如果score相同,则age降序
df.sort_values(by=['score', 'age'], ascending=[True, False])

# 参照score和age两个标准取最大的2个数据,如果score相同,再参照 age
df.nlargest(2, columns=['score', 'age'])
df.nsmallest(2, columns=['score', 'age']) # 取最小的2个数据

示例代码4:

python 复制代码
df = pd.DataFrame(
    {
        "name": ["A", "B", "C", "D"],
        "age": [11, 12, 13, 14],
        "score": [10.0, 20.0, 30.0, 40.0]
    },
    index=[1, 2, 3, 4],
    columns=["name", "score", "age"]  # 通过columns修改列的位置
)
print(df.cumsum())  # 累计和
print(df.cummax())  # 累计最大值 从上到下查看直到最大值
print(df.cummin())  # 累计最小值
# print(df.cummin(axis=1)) # axis=1表示按行累计

注:axis=0按列方向纵向运算(默认) ,上下行之间计算;axis=1按行方向横向运算,左右列之间计算


四、DataFrame 案例

案例1:学生成绩分析

python 复制代码
'''
案例1:学生成绩分析
场景:某班级的学生成绩数据如下,请完成以下任务:
1.计算每位学生的总分和平均分。
2.找出数学成绩高于90分或英语成绩高于85分的学生。
3.按总分从高到低排序,并输出前3名学生。
'''

data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '数学': [85, 92, 78, 88, 95],
    '英语': [90, 88, 85, 92, 80],
    '物理': [75, 80, 88, 85, 90]
}
df = pd.DataFrame(data)
print(df)

# 1.计算每位学生的总分和平均分。
print('每位学生的总分:')
df['总分'] = df[['数学', '英语', '物理']].sum(axis=1)  # axis=1 按照行算
df['平均分'] = df[['数学', '英语', '物理']].mean(axis=1)
df['平均分2'] = df['总分'] / 3

# 2.找出数学成绩高于90分或英语成绩高于85分的学生。
df[(df['数学'] > 90) | (df['英语'] > 85)]

# 3.按总分从高到低排序,并输出前3名学生。
r1 = df.sort_values(by=['总分'], ascending=False).head(3)
r2 = df.nlargest(3, columns=['总分'])
print(r1)
print(r2)

注:单层括号获取的是一列Series,双层方括号二列DataFrame,因此不能用 df[['数学', '英语']] 获取多列


案例2:销售数据分析

python 复制代码
'''
案例2:销售数据分析
场景:某公司销售数据如下,请完成以下任务:
1.计算每种产品的总销售额(销售额=单价x销量)
2.找出销售额最高的产品。
3.按销售额从高到低排序,并输出所有产品信息。
'''

data = {
    '产品名称': ['A', 'B', 'C', 'D'],
    '单价': [100, 150, 200, 120],
    '销量': [50, 30, 20, 40]
}
df = pd.DataFrame(data)
df['总销售额'] = df['单价'] * df['销量']
print(df)
print(df.nlargest(1, columns='总销售额'))
print(df.sort_values(by=['总销售额'], ascending=False))

案例3:电商用户行为分析

python 复制代码
'''
案例3:电商用户行为分析
场景:某电商平台的用户行数据如下,请完成以下任务:
1.计算每位用户的总消费会领(消费金额=商品单价x购买数量)
2.找出消费金额最高的用户,并输出其所有信息
3.计算所有用户的平均消费金额(保留2位小数)
4.统计电子产品的总购买数量
'''

data = {
    '用户ID': [101, 102, 103, 104, 105],
    '商品单价': [1200, 300, 800, 150, 200],
    '购买数量': [1, 3, 2, 5, 4],
    '用户名': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    '商品类别': ['电子产品', '服饰', '电子产品', '家居', '服饰']
}
df = pd.DataFrame(data)
# 1.每位用户的总消费会领(消费金额=商品单价x购买数量)
df['总消费'] = df['商品单价'] * df['购买数量']
print(df)

# 2.消费金额最高的用户
print(df.nlargest(1, columns=['总消费']))

# 3.所有用户的平均消费金额
print(df['总消费'].mean())

# 4.电子产品的总购买数量
df[df['商品类别'] == '电子产品']['购买数量'].sum()

注:df[布尔序列]筛选符合条件的行,返回DataFrame;提取购买数量列得到Series,最后求和。


参考链接:Python数据分析教程,零基础学会numpy+pandas+matplotlib数据分析,数据可视化

相关推荐
别动我齐刘海1 小时前
ROS2 Jazzy + C++ 实战路线——ros2_control
c++·人工智能·python·opencv·机器学习·机器人·github
ai大模型-探索者1 小时前
Git在PyCharm中的使用完全指南
pycharm·gitee
把头塞进显示器2 小时前
电商平台-测试报告
python·selenium·pytest
ShyanZh2 小时前
【Python3基础】01-Python 环境与开发工具
python
醇氧2 小时前
Git 合并冲突与`__pycache__` 的恩怨情仇
python·numpy·fastapi
ShyanZh2 小时前
【Python3基础】02-输入输出与程序运行
python
伞伞悦读2 小时前
【第39期】Python 第三方包安装详解:pip、conda、requirements、版本锁定和镜像源
python·conda·pip
Jialu.2 小时前
第7篇:舆情预警系统:三类规则引擎 + 飞书/钉钉 Webhook 通知
python·安全
甜到心里的蛋糕3 小时前
如何用企业微信实现让微信收到通知实时通知
服务器·python·微信小程序·fastapi