San*_*mar 21 python pandas parquet
我有一个镶木地板文件,我想n将文件中的第一行读入熊猫数据框中。我试过的:
df = pd.read_parquet(path= 'filepath', nrows = 10)
Run Code Online (Sandbox Code Playgroud)
它不起作用并给了我错误:
TypeError: read_table() got an unexpected keyword argument 'nrows'
Run Code Online (Sandbox Code Playgroud)
我也尝试过这个skiprows论点,但这也给了我同样的错误。
或者,我可以读取完整的镶木地板文件并过滤前 n 行,但这将需要我想避免的更多计算。
有什么方法可以实现吗?
Dav*_*tan 67
接受的答案已过时。现在可以只将 parquet 文件的前几行读入 pandas,尽管它有点混乱并且依赖于后端。
要使用 PyArrow 作为后端进行阅读,请执行以下操作:
from pyarrow.parquet import ParquetFile
import pyarrow as pa
pf = ParquetFile('file_name.pq')
first_ten_rows = next(pf.iter_batches(batch_size = 10))
df = pa.Table.from_batches([first_ten_rows]).to_pandas()
Run Code Online (Sandbox Code Playgroud)
更改行batch_size = 10以匹配您想要读入的行数。
San*_*mar 23
在四处探索并与 Pandas 开发团队取得联系后,终点是 Pandas 不支持参数nrows或skiprows在阅读 parquet 文件时。
原因是熊猫使用pyarrow或fastparquet镶木地板引擎来处理镶木地板文件,pyarrow并且不支持部分读取文件或通过跳过行读取文件(不确定fastparquet)。以下是pandas github上的issue讨论链接。
https://github.com/pandas-dev/pandas/issues/24511
从另一个角度来看,如果您熟悉 SQL,您可以考虑使用DuckDB。例如:
import duckdb
nrows = 10
file_path = 'path/to/data/parquet_file.parquet'
df = duckdb.query(f'SELECT * FROM "{file_path}" LIMIT {nrows};').df()
Run Code Online (Sandbox Code Playgroud)
如果您使用分区镶木地板,则上述结果将不包含任何分区列,因为该信息不存储在较低级别的文件中。相反,您应该将顶层文件夹标识为分区 parquet 数据集,并将其注册到 DuckDB 连接器:
import duckdb
import pyarrow.dataset as ds
nrows = 10
dataset = ds.dataset('path/to/data',
format='parquet',
partitioning='hive')
con = duckdb.connect()
con.register('data_table_name', dataset)
df = con.execute(f"SELECT * FROM data_table_name LIMIT {nrows};").df()
Run Code Online (Sandbox Code Playgroud)
您可以使用连接器注册多个数据集以启用更复杂的查询。我发现 DuckDB 使处理 Parquet 文件变得更加方便,尤其是在尝试在多个 Parquet 数据集之间进行 JOIN 时。conda install python-duckdb使用或安装它pip install duckdb
Parquet 文件是面向列的存储,专为此而设计......所以加载所有文件以访问一行是正常的。