0. 报错
Dataset.from_pandas(df)
时报错:
pyarrow.lib.ArrowInvalid: ('cannot mix struct and non-struct, non-null values', 'Conversion failed for column xxx with type object')
这个错误通常发生在将 Pandas DataFrame 转换为 Hugging Face Dataset 格式时,因为数据类型不匹配或某些列包含复杂数据结构(如嵌套列表或字典)。
1. 检查数据类型
确保 prompt
列中的数据类型一致且符合要求。可以使用以下代码检查数据类型:
print(df.dtypes)
如果每一列的类型是 object
,可能包含字符串或其他数据类型混合,需要进一步检查具体数据。
2. 数据清理
如果 object
类型中还嵌套list或者object,例如 pandas 其中一行数据为:
{
"data": {
"v1": {
"k1": "v2",
"k2": "v2"
},
"v2": [
"v11",
"v22"
]
}
}
对于这种复杂的数据结构,Dataset.from_pandas(df)
会报错,建议转为 JSON 字符串,例如:
import json
df['c1'] = df['c1'].apply(lambda x: json.dumps(x) if isinstance(x, (dict, list)) else x)
3. 示例代码
以下是一个完整的示例,展示如何处理和转换数据:
import pandas as pd
import json
from datasets import Dataset, Features, Value
# 示例数据
data = {
'c1': [
{'text': '这是一个示例提示1', 'id': 1},
{'text': '这是一个示例提示2', 'id': 2},
'这是一个简单的字符串'
],
'r1': ['回答1', '回答2', '回答3']
}
df = pd.DataFrame(data)
# 数据清理:将字典或列表转换为 JSON 字符串
df['c1'] = df['c1'].apply(lambda x: json.dumps(x) if isinstance(x, (dict, list)) else x)
# 定义 features
features = Features({
'c1': Value('string'),
'r1': Value('string')
})
# 转换为 Dataset
dataset = Dataset.from_pandas(df, features=features)
print(dataset)