如何将Pandas DataFrame转换为HuggingFace DatasetDict?
问题分析与解决方案
你的代码核心问题在于:用namedtuple自定义的Dataset和DatasetDict并非Hugging Face官方的数据集类型——官方Dataset是具备数据访问、预处理、存储等完整功能的专用对象,而你返回的列表或自定义元组无法实现与官方数据集一致的行为。
以下是符合要求的正确实现:
前置准备
确保已安装Hugging Face的datasets库:
pip install datasets
完整代码实现
import pandas as pd from datasets import Dataset, DatasetDict def convert_to_hf_dataset(df): # 重命名English列为en df = df.rename(columns={'English': 'en'}) # 拆分数据集:严格对应18000/1000/1000的行数分配 train_df = df.iloc[:18000].copy() val_df = df.iloc[18000:19000].copy() test_df = df.iloc[19000:20000].copy() # 构造符合要求的translation字段(示例中目标语言键为'to',对应原DataFrame的'te'列) def format_row(row): return {'translation': {'en': row['en'], 'to': row['te']}} # 将拆分后的DataFrame转换为官方Dataset对象 train_dataset = Dataset.from_pandas(train_df.apply(format_row, axis=1)) val_dataset = Dataset.from_pandas(val_df.apply(format_row, axis=1)) test_dataset = Dataset.from_pandas(test_df.apply(format_row, axis=1)) # 组合成标准DatasetDict return DatasetDict({ 'train': train_dataset, 'validation': val_dataset, 'test': test_dataset }) # 加载原始数据并转换 df = pd.read_csv('eng-to-te.csv') raw_datasets = convert_to_hf_dataset(df)
验证效果
- 查看数据集结构:
print(raw_datasets)
输出与你期望的格式完全一致:
DatasetDict({ train: Dataset({ features: ['translation'], num_rows: 18000 }) validation: Dataset({ features: ['translation'], num_rows: 1000 }) test: Dataset({ features: ['translation'], num_rows: 1000 }) })
- 访问训练集第一条数据:
print(raw_datasets["train"][0])
返回格式:
{'translation': {'en': 'Membership of Parliament: see Minutes', 'to': 'Componenţa Parlamentului: a se vedea procesul-verbal'}}
关键说明
- 无需手动模拟Dataset结构,直接使用
Dataset.from_pandas方法转换,自动继承官方Dataset的所有功能(如预处理流水线、保存到磁盘、加载等)。 - 若实际目标语言键应为
te而非示例中的to,只需将format_row函数里的'to'改为'te'即可。
内容的提问来源于stack exchange,提问作者Nithin Reddy
相关产品推荐
相关产品推荐

