# 加载表格数据

表格数据集是一种通用数据集，用于描述以行和列形式存储的任何数据，其中行表示一个样本，列表示一个特征（可以是连续型或类别型）。这些数据集通常存储在 CSV 文件、Pandas DataFrame 以及数据库表中。本指南将展示如何从以下来源加载和创建表格数据集：

- CSV 文件
- Pandas 数据框
- HDF5 文件
- 数据库

## CSV 文件

🤗 Datasets 可以通过在 [load_dataset()](/docs/datasets/main/zh/package_reference/loading_methods#datasets.load_dataset) 方法中指定通用的 `csv` 数据集构建器名称来读取 CSV 文件。若要加载多个 CSV 文件，请将它们作为列表传递给 `data_files` 参数：

```py
>>> from datasets import load_dataset
>>> dataset = load_dataset("csv", data_files="my_file.csv")

# load multiple CSV files
>>> dataset = load_dataset("csv", data_files=["my_file_1.csv", "my_file_2.csv", "my_file_3.csv"])
```

您也可以将特定的 CSV 文件映射到训练集和测试集：

```py
>>> dataset = load_dataset("csv", data_files={"train": ["my_train_file_1.csv", "my_train_file_2.csv"], "test": "my_test_file.csv"})
```

要加载远程 CSV 文件，请改为传入 URL：

```py
>>> base_url = "https://huggingface.co/datasets/lhoestq/demo1/resolve/main/data/"
>>> dataset = load_dataset('csv', data_files={"train": base_url + "train.csv", "test": base_url + "test.csv"})
```

要加载压缩的 CSV 文件：

```py
>>> url = "https://domain.org/train_data.zip"
>>> data_files = {"train": url}
>>> dataset = load_dataset("csv", data_files=data_files)
```

## Pandas 数据框

🤗 Datasets 还支持使用 [from_pandas()](/docs/datasets/main/zh/package_reference/main_classes#datasets.Dataset.from_pandas) 方法从 [Pandas DataFrames](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) 加载数据集：

```py
>>> from datasets import Dataset
>>> import pandas as pd

# create a Pandas DataFrame
>>> df = pd.read_csv("https://huggingface.co/datasets/imodels/credit-card/raw/main/train.csv")
>>> df = pd.DataFrame(df)
# load Dataset from Pandas DataFrame
>>> dataset = Dataset.from_pandas(df)
```

使用 `splits` 参数来指定数据集拆分（split）的名称：

```py
>>> train_ds = Dataset.from_pandas(train_df, split="train")
>>> test_ds = Dataset.from_pandas(test_df, split="test")
```

如果数据集看起来不符合预期，您应该显式地[指定数据集的特征](loading#specify-features)。[pandas.Series](https://pandas.pydata.org/docs/reference/api/pandas.Series.html) 并不总是包含足够的信息供 Arrow 自动推断数据类型。例如，如果 DataFrame 的长度为 `0`，或者 Series 仅包含 `None/NaN` 对象，则类型会被设置为 `null`。

## HDF5 文件

[HDF5](https://www.hdfgroup.org/solutions/hdf5/) 文件常用于在科学计算和机器学习中存储大量数值数据。使用 🤗 Datasets 加载 HDF5 文件与加载 CSV 文件类似：

```py
>>> from datasets import load_dataset
>>> dataset = load_dataset("hdf5", data_files="data.h5")
```

请注意，HDF5 加载器假定文件具有“表格”结构，即文件中所有数据集在第一维度上具有（相同数量的）行。

## 数据库

存储在数据库中的数据通常通过 SQL 查询来访问。借助 🤗 Datasets，您可以连接到数据库，查询所需的数据，并据此创建一个数据集。然后，您可以使用 🤗 Datasets 的所有处理功能来为训练准备数据集。

### SQLite

SQLite 是一款小巧、轻量级的数据库，速度快且易于配置。您可以使用现有的数据库，也可以按照以下步骤从零开始。

首先，使用来自纽约时报的这份[Covid-19 数据](https://github.com/nytimes/covid-19-data/blob/master/us-states.csv)快速创建一个 SQLite 数据库：

```py
>>> import sqlite3
>>> import pandas as pd

>>> conn = sqlite3.connect("us_covid_data.db")
>>> df = pd.read_csv("https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-states.csv")
>>> df.to_sql("states", conn, if_exists="replace")
```

这会在 `us_covid_data.db` 数据库中创建一个 `states` 表，现在你可以将其加载到数据集中。

要连接到数据库，您需要用于标识该数据库的 [URI 字符串](https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls)。使用 URI 连接数据库时，返回的数据集会被缓存。不同的数据库方言具有不同的 URI 字符串，因此请务必查阅您所使用的数据库对应的 [Database URLs](https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls)。

对于 SQLite，它是：

```py
>>> uri = "sqlite:///us_covid_data.db"
```

通过向 [from_sql()](/docs/datasets/main/zh/package_reference/main_classes#datasets.Dataset.from_sql) 传递表名和 URI 来加载表：

```py
>>> from datasets import Dataset

>>> ds = Dataset.from_sql("states", uri)
>>> ds
Dataset({
    features: ['index', 'date', 'state', 'fips', 'cases', 'deaths'],
    num_rows: 54382
})
```

然后，您可以使用 🤗 Datasets 的所有处理功能，例如 [filter()](/docs/datasets/main/zh/package_reference/main_classes#datasets.Dataset.filter)：

```py
>>> ds.filter(lambda x: x["state"] == "California")
```

您也可以从 SQL 查询而非整个表中加载数据集，这在查询和连接多个表时非常有用。

通过向 [from_sql()](/docs/datasets/main/zh/package_reference/main_classes#datasets.Dataset.from_sql) 传入查询和 URI 来加载数据集：

```py
>>> from datasets import Dataset

>>> ds = Dataset.from_sql('SELECT * FROM states WHERE state="California";', uri)
>>> ds
Dataset({
    features: ['index', 'date', 'state', 'fips', 'cases', 'deaths'],
    num_rows: 1019
})
```

然后，您可以使用 🤗 Datasets 的所有处理功能，例如 [filter()](/docs/datasets/main/zh/package_reference/main_classes#datasets.Dataset.filter)：

```py
>>> ds.filter(lambda x: x["cases"] > 10000)
```

### PostgreSQL

您也可以从 PostgreSQL 数据库连接并加载数据集，但由于该示例仅适用于在 notebook 中运行，因此我们不会在文档中直接演示具体方法。请查看此 [notebook](https://colab.research.google.com/github/nateraw/huggingface-hub-examples/blob/main/sql_with_huggingface_datasets.ipynb#scrollTo=d83yGQMPHGFi)，了解如何安装和配置 PostgreSQL 服务器！

设置好 PostgreSQL 数据库后，您可以使用 [from_sql()](/docs/datasets/main/zh/package_reference/main_classes#datasets.Dataset.from_sql) 方法从表或查询中加载数据集。

