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

注意事项

  • 修改 columnsindex 属性会直接影响原始 DataFrame。
  • lociloc 的区别在于索引方式(标签 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)
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐