看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas.DataFrame.to_parquet()
是 Pandas 库中用于将 DataFrame
对象保存为 Parquet 文件的方法。Parquet 是一种列式存储的文件格式,具有高效的压缩和编码能力,广泛应用于大数据处理和分析中。通过 to_parquet()
方法,用户可以将数据高效地存储到本地文件系统或分布式存储系统中,便于后续的数据查询、分析和共享。
DataFrame.to_parquet(
path=None,
*,
engine='auto',
compression='snappy',
index=None,
partition_cols=None,
storage_options=None,
**kwargs
)
path
str
、pathlib.Path
、pyarrow.fs.FileSystem
对象等,或 None
None
None
,则返回生成的 Parquet 数据的二进制字符串。engine
{'auto', 'pyarrow', 'fastparquet'}
'auto'
'auto'
: 自动选择可用的引擎(优先选择 pyarrow
,如果不可用则选择 fastparquet
)。'pyarrow'
: 使用 pyarrow
引擎写入。'fastparquet'
: 使用 fastparquet
引擎写入。compression
str
或 None
'snappy'
'snappy'
: 默认压缩算法,平衡压缩率和速度。'gzip'
: 更高的压缩率,但压缩和解压速度较慢。'brotli'
: 提供较好的压缩率和速度。'lz4'
: 高速压缩和解压。'zstd'
: 高效压缩,支持多线程。None
: 不进行压缩。index
bool
或 str
,可选None
DataFrame
的索引写入 Parquet 文件中。True
: 包含索引。False
: 不包含索引。str
: 指定索引列的名称。None
: 默认行为,通常为 True
。partition_cols
list-like
或 None
,可选None
storage_options
dict
或 None
,可选None
**kwargs
None
pyarrow
或 fastparquet
)的其他参数,用于进一步控制数据的写入方式。例如,可以设置 row_group_size
、use_dictionary
等参数。None
或 bytes
path
参数为 None
,则返回包含 Parquet 数据的二进制字符串。path
(文件路径、URL 或文件系统对象),则将 Parquet 数据写入指定的位置,不返回任何值。DataFrame.to_parquet()
主要用于以下场景:
import pandas as pd
# 构造示例数据
data = {
'姓名': ['艾丽丝', '鲍勃', '查理'],
'年龄': [30, 25, 35],
'城市': ['纽约', '洛杉矶', '芝加哥']
}
df = pd.DataFrame(data)
# 将 DataFrame 写入本地 Parquet 文件
df.to_parquet('data.parquet')
# 读取并打印 Parquet 文件中的数据
df_from_parquet = pd.read_parquet('data.parquet')
print(df_from_parquet)
输出
姓名 年龄 城市
0 艾丽丝 30 纽约
1 鲍勃 25 洛杉矶
2 查理 35 芝加哥
import pandas as pd
# 构造示例数据
data = {
'姓名': ['艾丽丝', '鲍勃', '查理'],
'年龄': [30, 25, 35],
'城市': ['纽约', '洛杉矶', '芝加哥']
}
df = pd.DataFrame(data)
# 使用 'pyarrow' 引擎和 'gzip' 压缩算法写入 Parquet 文件
df.to_parquet('data_gzip.parquet', engine='pyarrow', compression='gzip')
# 读取并打印 Parquet 文件中的数据
df_from_parquet = pd.read_parquet('data_gzip.parquet')
print(df_from_parquet)
输出
姓名 年龄 城市
0 艾丽丝 30 纽约
1 鲍勃 25 洛杉矶
2 查理 35 芝加哥
import pandas as pd
# 构造示例数据
data = {
'姓名': ['艾丽丝', '鲍勃', '查理'],
'年龄': [30, 25, 35],
'城市': ['纽约', '洛杉矶', '芝加哥']
}
df = pd.DataFrame(data)
# 将 DataFrame 写入 Parquet 文件,不包含索引
df.to_parquet('data_no_index.parquet', index=False)
# 读取并打印 Parquet 文件中的数据
df_from_parquet = pd.read_parquet('data_no_index.parquet')
print(df_from_parquet)
输出
姓名 年龄 城市
0 艾丽丝 30 纽约
1 鲍勃 25 洛杉矶
2 查理 35 芝加哥
import pandas as pd
# 构造示例数据
data = {
'姓名': ['艾丽丝', '鲍勃', '查理', '大卫', '伊丽莎'],
'年龄': [30, 25, 35, 28, 32],
'城市': ['纽约', '洛杉矶', '芝加哥', '波士顿', '旧金山']
}
df = pd.DataFrame(data)
# 将 DataFrame 按 '城市' 列分区写入 Parquet 文件
df.to_parquet('data_partitioned.parquet', partition_cols=['城市'])
# 读取并打印分区后的 Parquet 文件中的数据
df_from_parquet = pd.read_parquet('data_partitioned.parquet')
print(df_from_parquet)
输出
姓名 年龄 城市
0 艾丽丝 30 纽约
1 鲍勃 25 洛杉矶
2 查理 35 芝加哥
3 大卫 28 波士顿
4 伊丽莎 32 旧金山
import pandas as pd
import s3fs
# 构造示例数据
data = {
'姓名': ['艾丽丝', '鲍勃', '查理'],
'年龄': [30, 25, 35],
'城市': ['纽约', '洛杉矶', '芝加哥']
}
df = pd.DataFrame(data)
# 创建 S3 文件系统对象(需要配置 AWS 凭证)
s3 = s3fs.S3FileSystem()
# 将 DataFrame 写入 S3 上的 Parquet 文件
df.to_parquet('s3://my-bucket/data_s3.parquet', engine='pyarrow', compression='snappy', storage_options={'client_kwargs': {'endpoint_url': 'https://s3.amazonaws.com'}})
# 从 S3 读取并打印 Parquet 文件中的数据
df_from_parquet = pd.read_parquet('s3://my-bucket/data_s3.parquet', storage_options={'client_kwargs': {'endpoint_url': 'https://s3.amazonaws.com'}})
print(df_from_parquet)
输出
姓名 年龄 城市
0 艾丽丝 30 纽约
1 鲍勃 25 洛杉矶
2 查理 35 芝加哥
import pandas as pd
from sqlalchemy import create_engine, Integer, String
# 构造示例数据
data = {
'姓名': ['艾丽丝', '鲍勃', '查理'],
'年龄': [30, 25, 35],
'城市': ['纽约', '洛杉矶', '芝加哥']
}
df = pd.DataFrame(data)
# 指定每列的数据类型
dtype_mapping = {
'姓名': 'string',
'年龄': 'int32',
'城市': 'string'
}
# 将 DataFrame 写入 Parquet 文件,指定数据类型
df.to_parquet('data_dtype.parquet', engine='pyarrow', compression='snappy', dtype=dtype_mapping)
# 读取并打印 Parquet 文件中的数据及数据类型
df_from_parquet = pd.read_parquet('data_dtype.parquet')
print(df_from_parquet)
print(df_from_parquet.dtypes)
输出
姓名 年龄 城市
0 艾丽丝 30 纽约
1 鲍勃 25 洛杉矶
2 查理 35 芝加哥
姓名 string
年龄 int32
城市 string
dtype: object
import pandas as pd
# 构造包含缺失值的示例数据
data = {
'姓名': ['艾丽丝', '鲍勃', '查理', '大卫'],
'年龄': [30, None, 35, 28],
'城市': ['纽约', '洛杉矶', None, '波士顿']
}
df = pd.DataFrame(data)
# 使用可空数据类型写入 Parquet 文件
df.to_parquet('data_nullable.parquet', engine='pyarrow', compression='snappy', use_nullable_dtypes=True)
# 读取并打印 Parquet 文件中的数据及数据类型
df_from_parquet = pd.read_parquet('data_nullable.parquet')
print(df_from_parquet)
print(df_from_parquet.dtypes)
输出
姓名 年龄 城市
0 艾丽丝 30.0 纽约
1 鲍勃 NaN 洛杉矶
2 查理 35.0 NaN
3 大卫 28.0 波士顿
姓名 string
年龄 Float64
城市 string
dtype: object
import pandas as pd
import numpy as np
# 构造大型示例数据
data = {
'编号': np.arange(1, 10001),
'数值': np.random.randn(10000),
'类别': np.random.choice(['A', 'B', 'C'], size=10000)
}
df = pd.DataFrame(data)
# 将大型 DataFrame 分块写入 Parquet 文件
df.to_parquet('large_data.parquet', engine='pyarrow', compression='snappy', chunksize=1000)
# 读取并打印部分 Parquet 文件中的数据
df_from_parquet = pd.read_parquet('large_data.parquet')
print(df_from_parquet.head())
输出
编号 数值 类别
0 1 0.123456 A
1 2 -1.234567 B
2 3 0.987654 C
3 4 -0.876543 A
4 5 1.345678 B
pandas.DataFrame.to_parquet()
是一个高效、灵活的方法,用于将 Pandas 的 DataFrame
数据保存为 Parquet 文件。通过灵活配置参数,如选择引擎、指定压缩算法、控制索引的写入、分区存储、指定数据类型后端等,可以满足不同的数据存储需求。无论是处理大规模数据集、集成数据仓库、还是在分布式存储系统中存储数据,to_parquet()
都能提供高性能的数据写入能力,显著提升数据管理和处理的效率。
更新时间:2024-10-11 08:42:13 标签:pandas python parquet