数据分析——数据可视化(三)
DataFrame的定义
DataFrame 的定义
DataFrame 是一种二维表格型数据结构,类似于电子表格或关系型数据库中的表。它由行和列组成,每列可以包含不同类型的数据(数值、字符串、布尔值等),但同一列的数据类型必须一致。DataFrame 是数据分析中常用的核心数据结构,尤其在 Python 的 Pandas 库中广泛使用。
DataFrame 的核心特性
- 行列结构:DataFrame 具有行(记录)和列(字段)的标签,行标签称为索引(Index),列标签称为列名(Columns)。
- 异构数据:不同列可以存储不同类型的数据(如整数、浮点数、字符串等)。
- 大小可变:可以动态增加或删除行/列。
- 数据对齐:操作(如运算)会自动按行/列标签对齐数据。
DataFrame 的典型应用场景
- 数据清洗与预处理(处理缺失值、去重、类型转换等)。
- 数据聚合与统计(分组、透视表、描述性统计)。
- 数据可视化前的结构化整理。
- 机器学习中特征与标签的存储。
与其他结构的对比
- 与 Series 对比:Series 是单列数据结构,而 DataFrame 是多列的集合。
- 与 NumPy 数组对比:NumPy 数组要求所有元素类型相同,DataFrame 允许列类型不同。
- 与字典对比:字典的键值对中值可以是任意类型,但 DataFrame 的列需为统一类型。
DataFrame的创建
通过Series来创建
每一列都是一个Series类型,整个序列是一个DataFrame类型
# dataframe的创建
import pandas as pd
import numpy as np
# 通过Series来创建
s1 = pd.Series([1, 2, 3, 4, 5])
s2 = pd.Series([6, 7, 8, 9, 10])
df = pd.DataFrame({"第一列":s1, "第二列":s2})
df
print(type(df))
print(type(df["第一列"]))
通过字典来创建
# 通过字典来创建
# index 用来设置索引
# columns 用来设置要显示的列,以及修改列的呈现顺序
df = pd.DataFrame(
{
"id":[1,2,3,4],
"name":['九月','小刘','小秦','小王'],
"age":[20,30,40,50],
"score":[60.5,80,70,75]
},
index=[1,2,3,4],columns=["name","score","age"]
)
df
DataFrame 属性概述
DataFrame 是 Pandas 库中用于处理结构化数据的核心数据结构,其属性可分为以下几类:
基本属性
- shape: 返回 DataFrame 的行数和列数,格式为
(rows, columns)。 - dtypes: 返回每列的数据类型。
- columns: 返回列名列表,可通过赋值修改列名。
- index: 返回行索引对象,支持自定义索引。
- values: 以 NumPy 数组形式返回数据(不包含索引和列名)。
- empty: 布尔值,判断 DataFrame 是否为空。
内容属性
- loc: 通过标签索引行或列(如
df.loc[row_label, col_label])。 - iloc: 通过整数位置索引行或列(如
df.iloc[row_idx, col_idx])。 - at: 快速访问单个标量值(标签索引,类似
loc的单值版本)。 - iat: 快速访问单个标量值(整数索引,类似
iloc的单值版本)。
统计属性
- describe(): 生成描述性统计信息(如计数、均值、标准差等)。
- info(): 显示 DataFrame 的简要摘要(包括数据类型和非空值计数)。
- T: 转置 DataFrame(行列互换)。
- size: 返回元素总数(行数 × 列数)。
- ndim: 返回维度数(DataFrame 始终为 2)。
示例代码
基本属性
shape
返回 DataFrame 的行数和列数,格式为 (行数, 列数)。
import pandas as pd
df = pd.DataFrame({'A': [1, 2], 'B': ['x', 'y']})
print(df.shape) # 输出: (2, 2)
columns
获取列名列表,可通过赋值修改列名。
print(df.columns) # 输出: Index(['A', 'B'], dtype='object')
df.columns = ['Col1', 'Col2'] # 修改列名
index
获取或设置行索引。支持自定义索引(如时间序列、字符串等)。
print(df.index) # 输出: RangeIndex(start=0, stop=2, step=1)
df.index = ['row1', 'row2'] # 修改索引
dtypes
返回每列的数据类型。
print(df.dtypes) # 输出: Col1:int64, Col2:object
数据访问属性
values
将 DataFrame 转换为 NumPy 数组,不包含索引和列名。
print(df.values) # 输出: [[1 'x'], [2 'y']]
loc
通过标签(行/列名)访问数据。
print(df.loc['row1', 'Col1']) # 输出: 1
iloc
通过整数位置访问数据。
print(df.iloc[0, 1]) # 输出: 'x'
at / iat
快速访问标量值(类似 loc/iloc,但仅用于单个值)。
print(df.at['row1', 'Col1']) # 输出: 1
print(df.iat[0, 0]) # 输出: 1
统计属性
describe()
生成描述性统计(均值、标准差、分位数等)。
print(df.describe()) # 仅统计数值列
info()
显示 DataFrame 的简要摘要(内存占用、非空值计数等)。
df.info() # 输出: 列名、非空计数、数据类型
isna() / notna()
检查缺失值(返回布尔矩阵)。
print(df.isna()) # 输出: 各位置是否为 NaN
其他属性
T
转置 DataFrame(行列互换)。
print(df.T) # 行变列,列变行
empty
判断 DataFrame 是否为空。
print(df.empty) # 输出: False
memory_usage()
返回每列的内存占用(字节)。
print(df.memory_usage())
代码案例
示例 DataFrame 操作
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30]}
df = pd.DataFrame(data)
# 修改索引
df.index = ['id1', 'id2']
# 筛选数据
adults = df[df['Age'] > 25]
# 添加新列
df['Employed'] = [True, False]
# 分组统计
print(df.groupby('Employed').mean())
注意事项
- 修改
columns或index属性会直接影响原始 DataFrame。 loc和iloc的区别在于索引方式(标签 vs 位置)。- 使用
describe()时,默认仅统计数值列,可通过include='all'包含非数值列。
访问DataFrame的数据
使用loc和iloc访问数据
# 某列
print(df.loc[1:3,"name"])
print(df.iloc[:,0])
# 单个元素
print(df.at[2,"name"]) # 显式索引
print(df.iat[1,0]) # 隐式索引
print(df.loc[2,"name"]) # 显式索引
print(df.iloc[1,0]) # 隐式索引
获取单个元素
# 获取单列数据
print(df["name"]) # 只能获取单列数据
print(type(df["name"]))
print(df.name) # 只能获取单列数据
print(type(df.name))
print(df[['name']]) # 可以获取多列数据
print(type(df[['name']]))
df[['name']]
获取多列数据
通过列名列表选择多个列:
print(df[["name","score"]])
使用filter方法按列名模式选择:

df.filter(like='name')
df.filter(regex='age')
访问行数据
通过head/tail方法访问首尾行:
df.head(n) # 查看前n行数据,默认是5行
df.tail(n) # 查看后n行数据,默认是5行
使用sample随机抽样行:
df.sample(n=5) # 随机5行
DataFrame 常见方法
基本方法
print(df.sum()) # 总和
print(df['score'].sum()) # 求某一列的总和
print(df.age.max()) # 最大值
print(df.age.min()) # 最小值
print(df.score.mean()) # 平均数
print(df.age.median()) # 中位数
print(df.age.mode()) # 众数
print(df.score.std()) # 标准差
print(df.score.var()) # 方差
print(df.score.quantile(0.25)) # 分位数
查看数据
# 查看前几行
df.head()
# 查看后几行
df.tail()
# 查看基本信息
df.info()
# 查看统计摘要
df.describe()
# 取前两个数值最大的记录,先根据 score 来取,再根据 age 来取
df.nlargest(2,['score','age'])
# 取前两个数值最小的记录,先根据 score 来取,再根据 age 来取
df.nsmallest(2,['score','age'])
过滤数据
# 条件过滤
df[df['age'] > 30]
# 多条件过滤
df[(df['age'] > 25) & (df['name'] != 'Bob')]
排序数据
# 按列排序
df.sort_values('age', ascending=False)
# 按多列排序
df.sort_values(['age', 'Name'])
# 按索引降序排序
print(df.sort_index(ascending=False))
# 通过 age 按降序排序
print(df.sort_values(by='age', ascending=False))
# 先根据 age 按升序排列,再根据 score 按降序排列
print(df.sort_values(by=['age', 'score'], ascending=[True, False]))
处理缺失值
# 检查缺失值
df.isnull()
# 删除缺失值
df.dropna()
# 填充缺失值
df.fillna(0)
# 获取每一列非缺失值的个数
print(df.count())
# 获取每条记录出现的次数
print(df.value_counts())
去重与替换
print(df.drop_duplicates()) # 去重
print(df.duplicated()) # 检查是否有重复
print(df.duplicated(subset='age')) # 检查 age 是否有重复
print(df.replace(23,24)) # 替换
累计值
df.cumsum() # 累计和
df.cummax() # 累计最大值
df.cummin() # 累计最小值
分组聚合
# 简单分组
df.groupby('age').count()
# 复杂聚合
df.groupby('age').agg({'name': 'count', 'age': 'mean'})
合并 DataFrame
# 横向合并
pd.concat([df1, df2], axis=1)
# 纵向合并
pd.concat([df1, df2], axis=0)
# SQL 风格合并
pd.merge(df1, df2, on='key')
重命名列
df.rename(columns={'OldName': 'NewName'}, inplace=True)
删除列
df.drop('ColumnName', axis=1, inplace=True)
设置索引
df.set_index('ColumnName', inplace=True)
重置索引
df.reset_index(inplace=True)
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)