原创 首页 技术

Pandas 基础教程:Series、DataFrame 与文件读写

LinJHS 1

1 Pandas 简介

数据结构:

  • Series:类似一维数组,由一组数据和与之相关的数据标签组成;

  • DataFrame:类似二维数组,由多个 Series 按列排列构成的表格(有行索引和列索引)。

1.1 Series

案例:

import pandas as pd

# 创建一个Series对象,指定名称为'A',值分别为1, 2, 3, 4
# 默认索引为0, 1, 2, 3
series = pd.Series([1, 2, 3, 4], name='A')
# 如果你想要显式地设置索引,可以这样做:
custom_index = [1, 2, 3, 4]  # 自定义索引
series_with_index = pd.Series([1, 2, 3, 4], index=custom_index, name='A')

创建 Series:

pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
  • data:Series 的数据部分,可以是列表、数组、字典、标量值等。如果不提供此参数,则创建一个空的 Series。

  • index:Series 的索引部分,用于对数据进行标记。可以是列表、数组、索引对象等。如果不提供此参数,则创建一个默认的整数索引。

  • dtype:指定 Series 的数据类型。可以是 NumPy 的数据类型,例如 np.int64、np.float64 等。如果不提供此参数,则根据数据自动推断数据类型。

  • name:Series 的名称,用于标识 Series 对象。如果提供了此参数,则创建的 Series 对象将具有指定的名称。

  • copy:是否复制数据。默认为 False,表示不复制数据。如果设置为 True,则复制输入的数据。

  • fastpath:是否启用快速路径。默认为 False。启用快速路径可能会在某些情况下提高性能。

# 自定义索引值
a = ["Google", "Runoob", "Wiki"]
myvar = pd.Series(a, index = ["x", "y", "z"])
print(myvar["y"])

# 使用字典创建 Series
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}  
myvar = pd.Series(sites)
myvar = pd.Series(sites, index = [1, 2]) # 我只需要字典中的一部分数据

下面是 Series 中一些常用的方法:

方法名称

功能描述

index

获取 Series 的索引

values

获取 Series 的数据部分(返回 NumPy 数组)

head(n)

返回 Series 的前 n 行(默认为 5)

tail(n)

返回 Series 的后 n 行(默认为 5)

dtype

返回 Series 中数据的类型

shape

返回 Series 的形状(行数)

describe()

返回 Series 的统计描述(如均值、标准差、最小值等)

isnull()

返回一个布尔 Series,表示每个元素是否为 NaN

notnull()

返回一个布尔 Series,表示每个元素是否不是 NaN

unique()

返回 Series 中的唯一值(去重)

value_counts()

返回 Series 中每个唯一值的出现次数

map(func)

将指定函数应用于 Series 中的每个元素

apply(func)

将指定函数应用于 Series 中的每个元素,常用于自定义操作

astype(dtype)

将 Series 转换为指定的类型

sort_values()

对 Series 中的元素进行排序(按值排序)

sort_index()

对 Series 的索引进行排序

dropna()

删除 Series 中的缺失值(NaN)

fillna(value)

填充 Series 中的缺失值(NaN)

replace(to_replace, value)

替换 Series 中指定的值

cumsum()

返回 Series 的累计求和

cumprod()

返回 Series 的累计乘积

shift(periods)

将 Series 中的元素按指定的步数进行位移

rank()

返回 Series 中元素的排名

corr(other)

计算 Series 与另一个 Series 的相关性(皮尔逊相关系数)

cov(other)

计算 Series 与另一个 Series 的协方差

to_list()

将 Series 转换为 Python 列表

to_frame()

将 Series 转换为 DataFrame

iloc[]

通过位置索引来选择数据

loc[]

通过标签索引来选择数据

1.1.1 创建 Series

# 使用列表创建 Series
s = pd.Series([1, 2, 3, 4])

# 使用 NumPy 数组创建 Series
s = pd.Series(np.array([1, 2, 3, 4]))

# 使用字典创建 Series
s = pd.Series({'a': 1, 'b': 2, 'c': 3, 'd': 4})

1.1.2 基本操作

# 指定索引创建 Series
s = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])

# 获取值
value = s[2]  # 获取索引为2的值
print(s['a'])  # 返回索引标签 'a' 对应的元素

# 获取多个值
subset = s[1:4]  # 获取索引为1到3的值

# 使用自定义索引
value = s['b']  # 获取索引为'b'的值

# 索引和值的对应关系
for index, value in s.items():
    print(f"Index: {index}, Value: {value}")


# 使用切片语法来访问 Series 的一部分
print(s['a':'c'])  # 返回索引标签 'a' 到 'c' 之间的元素
print(s[:3])  # 返回前三个元素

# 为特定的索引标签赋值
s['a'] = 10  # 将索引标签 'a' 对应的元素修改为 10

# 通过赋值给新的索引标签来添加元素
s['e'] = 5  # 在 Series 中添加一个新的元素,索引标签为 'e'

# 使用 del 删除指定索引标签的元素。
del s['a']  # 删除索引标签 'a' 对应的元素

# 使用 drop 方法删除一个或多个索引标签,并返回一个新的 Series。
s_dropped = s.drop(['b'])  # 返回一个删除了索引标签 'b' 的新 Series

1.1.3 基本运算

# 算术运算
result = series * 2  # 所有元素乘以2

# 过滤
filtered_series = series[series > 2]  # 选择大于2的元素

# 数学函数
import numpy as np
result = np.sqrt(series)  # 对每个元素取平方根

1.1.4 统计数据

print(s.sum())  # 输出 Series 的总和
print(s.mean())  # 输出 Series 的平均值
print(s.max())  # 输出 Series 的最大值
print(s.min())  # 输出 Series 的最小值
print(s.std())  # 输出 Series 的标准差

1.1.5 属性和方法

# 获取索引
index = s.index

# 获取值数组
values = s.values

# 获取描述统计信息
stats = s.describe()

# 获取最大值和最小值的索引
max_index = s.idxmax()
min_index = s.idxmin()

# 其他属性和方法
print(s.dtype)   # 数据类型
print(s.shape)   # 形状
print(s.size)    # 元素个数
print(s.head())  # 前几个元素,默认是前 5 个
print(s.tail())  # 后几个元素,默认是后 5 个
print(s.sum())   # 求和
print(s.mean())  # 平均值
print(s.std())   # 标准差
print(s.min())   # 最小值
print(s.max())   # 最大值

1.1.6 其他

print(s > 2)  # 返回一个布尔 Series,满足条件的位置会标记为 True,反之亦然
print(s.dtype)  # 输出 Series 的数据类型
s = s.astype('float64')  # 将 Series 中的所有元素转换为 float64 类型

1.2 DataFrame

构造方法:

pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

参数说明:

  • data:DataFrame 的数据部分,可以是字典、二维数组、Series、DataFrame 或其他可转换为 DataFrame 的对象。如果不提供此参数,则创建一个空的 DataFrame。

  • index:DataFrame 的行索引,用于标识每行数据。可以是列表、数组、索引对象等。如果不提供此参数,则创建一个默认的整数索引。

  • columns:DataFrame 的列索引,用于标识每列数据。可以是列表、数组、索引对象等。如果不提供此参数,则创建一个默认的整数索引。

  • dtype:指定 DataFrame 的数据类型。可以是 NumPy 的数据类型,例如 np.int64、np.float64 等。如果不提供此参数,则根据数据自动推断数据类型。

  • copy:是否复制数据。默认为 False,表示不复制数据。如果设置为 True,则复制输入的数据。

DataFrame 的常用操作和方法如下表所示:

方法名称

功能描述

head(n)

返回 DataFrame 的前 n 行数据(默认前 5 行)

tail(n)

返回 DataFrame 的后 n 行数据(默认后 5 行)

info()

显示 DataFrame 的简要信息,包括列名、数据类型、非空值数量等

describe()

返回 DataFrame 数值列的统计信息,如均值、标准差、最小值等

shape

返回 DataFrame 的行数和列数(行数, 列数)

columns

返回 DataFrame 的所有列名

index

返回 DataFrame 的行索引

dtypes

返回每一列的数值数据类型

sort_values(by)

按照指定列排序

sort_index()

按行索引排序

dropna()

删除含有缺失值(NaN)的行或列

fillna(value)

用指定的值填充缺失值

isnull()

判断缺失值,返回一个布尔值 DataFrame

notnull()

判断非缺失值,返回一个布尔值 DataFrame

loc[]

按标签索引选择数据

iloc[]

按位置索引选择数据

at[]

访问 DataFrame 中单个元素(比 loc[] 更高效)

iat[]

访问 DataFrame 中单个元素(比 iloc[] 更高效)

apply(func)

对 DataFrame 或 Series 应用一个函数

applymap(func)

对 DataFrame 的每个元素应用函数(仅对 DataFrame)

groupby(by)

分组操作,用于按某一列分组进行汇总统计

pivot_table()

创建透视表

merge()

合并多个 DataFrame(类似 SQL 的 JOIN 操作)

concat()

按行或按列连接多个 DataFrame

to_csv()

将 DataFrame 导出为 CSV 文件

to_excel()

将 DataFrame 导出为 Excel 文件

to_json()

将 DataFrame 导出为 JSON 格式

to_sql()

将 DataFrame 导出为 SQL 数据库

query()

使用 SQL 风格的语法查询 DataFrame

duplicated()

返回布尔值 DataFrame,指示每行是否是重复的

drop_duplicates()

删除重复的行

set_index()

设置 DataFrame 的索引

reset_index()

重置 DataFrame 的索引

transpose()

转置 DataFrame(行列交换)

1.2.1 创建 DataFrame

import pandas as pd
import numpy as np

# 通过字典创建 DataFrame
df = pd.DataFrame({'Column1': [1, 2, 3], 'Column2': [4, 5, 6]})
# 从列表的列表创建
df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]],
                  columns=['Column1', 'Column2', 'Column3'])
# 通过 NumPy 数组创建 DataFrame
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))
# 从 Series 创建 DataFrame
s1 = pd.Series(['Alice', 'Bob', 'Charlie'])
s2 = pd.Series([25, 30, 35])
s3 = pd.Series(['New York', 'Los Angeles', 'Chicago'])
df = pd.DataFrame({'Name': s1, 'Age': s2, 'City': s3})

1.2.2 DataFrame 的属性和方法

# DataFrame 的属性和方法
print(df.shape)     # 形状
print(df.columns)   # 列名
print(df.index)     # 索引
print(df.head())    # 前几行数据,默认是前 5 行
print(df.tail())    # 后几行数据,默认是后 5 行
print(df.info())    # 数据信息
print(df.describe())# 描述统计信息
print(df.mean())    # 求平均值
print(df.sum())     # 求和

1.2.3 访问 DataFrame 元素

# --- 访问列 ---
# 通过列名访问
print(df['Column1'])
# 通过属性访问
print(df.Name)
# 通过 .loc[] 访问
print(df.loc[:, 'Column1'])
# 通过 .iloc[] 访问
print(df.iloc[:, 0])  # 假设 'Column1' 是第一列
# 访问单个元素
print(df['Name'][0])

# --- 访问行 ---
# 通过行标签访问
print(df.loc[0, 'Column1'])

1.2.4 修改 DataFrame

df['Column1'] = [10, 11, 12] # 修改列数据
df['NewColumn'] = [100, 200, 300] # 添加新列

# 使用 loc 为特定索引添加新行
df.loc[3] = [13, 14, 15, 16]

# 使用 append 添加新行到末尾(注:已被弃用)
new_row = {'Column1': 13, 'Column2': 14, 'NewColumn': 16}
df = df.append(new_row, ignore_index=True)

# 使用concat添加新行
new_row = pd.DataFrame([[4, 7]], columns=['A', 'B'])  # 创建一个只包含新行的DataFrame
df = pd.concat([df, new_row], ignore_index=True)  # 将新行添加到原始DataFrame

print(df)

1.2.5 删除 DataFrame 元素

df_dropped = df.drop('Column1', axis=1) # 删除列
df_dropped = df.drop(0)  # 删除索引为 0 的行

1.2.6 DataFrame 统计分析

# 描述性统计:使用 .describe() 查看数值列的统计摘要。
df.describe()
# 计算统计数据:使用聚合函数如 .sum()、.mean()、.max() 等。
df['Column1'].sum()
df.mean()

1.2.7 DataFrame 的索引操作

# 重置索引:使用 .reset_index()。
df_reset = df.reset_index(drop=True)
# 设置索引:使用 .set_index()。
df_set = df.set_index('Column1')

1.2.8 DataFrame 的布尔索引

# 使用布尔表达式:根据条件过滤 DataFrame。
df[df['Column1'] > 2]

1.2.9 DataFrame 的数据类型

# 查看数据类型:使用 dtypes 属性。
df.dtypes
# 转换数据类型:使用 astype 方法。
df['Column1'] = df['Column1'].astype('float64')

1.2.10 DataFrame 的合并与分割

# 合并:使用 concat 或 merge 方法。
# 纵向合并
pd.concat([df1, df2], ignore_index=True)
# 横向合并
pd.merge(df1, df2, on='Column1')

# 分割:使用 pivot、melt 或自定义函数。
# 长格式转宽格式
df_pivot = df.pivot(index='Column1', columns='Column2', values='Column3')
# 宽格式转长格式
df_melt = df.melt(id_vars='Column1', value_vars=['Column2', 'Column3'])

1.2.11 索引和切片

# 索引和切片
print(df[['Name', 'Age']])  # 提取多列
print(df[1:3])               # 切片行
print(df.loc[:, 'Name'])     # 提取单列
print(df.loc[1:2, ['Name', 'Age']])  # 标签索引提取指定行列
print(df.iloc[:, 1:])        # 位置索引提取指定列

2 Pandas 文件

2.1 Pandas CSV 文件

2.1.1 读取 CSV 文件

import pandas as pd

# 读取 CSV 文件,并自定义列名和分隔符
df = pd.read_csv('data.csv', sep=';', header=0, names=['A', 'B', 'C'], dtype={'A': int, 'B': float})
print(df)

read_csv 常用参数:

参数

说明

默认值

filepath_or_buffer

CSV 文件的路径或文件对象(支持 URL、文件路径、文件对象等)

必需参数

sep

定义字段分隔符,默认是逗号(,),可以改为其他字符,如制表符(\t)

','

header

指定行号作为列标题,默认为 0(表示第一行),或者设置为 None 没有标题

0

names

自定义列名,传入列名列表

None

index_col

用作行索引的列的列号或列名

None

usecols

读取指定的列,可以是列的名称或列的索引

None

dtype

强制将列转换为指定的数据类型

None

skiprows

跳过文件开头的指定行数,或者传入一个行号的列表

None

nrows

读取前 N 行数据

None

na_values

指定哪些值应视为缺失值(NaN)

None

skipfooter

跳过文件结尾的指定行数

0

encoding

文件的编码格式(如 utf-8,latin1 等)

None

2.1.2 写入 CSV 文件

import pandas as pd

# 假设 df 是一个已有的 DataFrame
df.to_csv('output.csv', index=False, header=True, columns=['A', 'B'])

to_csv 常用参数:

参数

说明

默认值

path_or_buffer

CSV 文件的路径或文件对象(支持文件路径、文件对象)

必需参数

sep

定义字段分隔符,默认是逗号(,),可以改为其他字符,如制表符(\t)

','

index

是否写入行索引,默认 True 表示写入索引

True

columns

指定写入的列,可以是列的名称列表

None

header

是否写入列名,默认 True 表示写入列名,设置为 False 表示不写列名

True

mode

写入文件的模式,默认是 w(写模式),可以设置为 a(追加模式)

'w'

encoding

文件的编码格式,如 utf-8,latin1 等

None

line_terminator

定义行结束符,默认为 \n

None

quoting

设置如何对文件中的数据进行引号处理(0-3,具体引用方式可查文档)

None

quotechar

设置用于引用的字符,默认为双引号 "

'"'

date_format

自定义日期格式,如果列包含日期数据,则可以使用此参数指定日期格式

None

doublequote

如果为 True,则在写入时会将包含引号的文本使用双引号括起来

True

2.2 Pandas Excel 文件

略,详情请看此处.

2.3 Pandas JSON 文件

import pandas as pd

df = pd.read_json(
    path_or_buffer,      # JSON 文件路径、JSON 字符串或 URL
    orient=None,         # JSON 数据的结构方式,默认是 'columns'
    dtype=None,          # 强制指定列的数据类型
    convert_axes=True,   # 是否转换行列索引
    convert_dates=True,  # 是否将日期解析为日期类型
    keep_default_na=True # 是否保留默认的缺失值标记
)

df.to_json(
    path_or_buffer=None,    # 输出的文件路径或文件对象,如果是 None 则返回 JSON 字符串
    orient=None,            # JSON 格式方式,支持 'split', 'records', 'index', 'columns', 'values'
    date_format=None,       # 日期格式,支持 'epoch', 'iso'
    default_handler=None,   # 自定义非标准类型的处理函数
    lines=False,            # 是否将每行数据作为一行(适用于 'records' 或 'split')
    encoding='utf-8'        # 编码格式
)

3 参考资料

  • Pandas 教程 https://www.runoob.com/pandas/

分享
如果这篇文章帮到你,可以请我喝一杯茶。

微信扫码打开

请我喝杯茶

如果这篇文章帮到你,可以请我喝一杯茶。

微信收款码
在商城请我一杯