Traceback (most recent call last): File "E:\python\Lib\site-packages\pandas\core\internals\construction.py", line 939, in _finalize_columns_and_data columns = _validate_or_indexify_columns(contents, columns) File "E:\python\Lib\site-packages\pandas\core\internals\construction.py", line 986, in _validate_or_indexify_columns raise AssertionError( ...<2 lines>... ) AssertionError: 2 columns passed, passed data had 18 columns The above exception was the direct cause of the following exception: Traceback (most recent call last): File "E:\pycharm\PythonProject\excel导入测试.py", line 14, in <module> df1 = pd.DataFrame([keys1,values1],columns=['<UNK>','<UNK>']) File "E:\python\Lib\site-packages\pandas\core\frame.py", line 851, in __init__ arrays, columns, index = nested_data_to_arrays( ~~~~~~~~~~~~~~~~~~~~~^ # error: Argument 3 to "nested_data_to_arrays" has incompatible ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<4 lines>... dtype, ^^^^^^ ) ^ File "E:\python\Lib\site-packages\pandas\core\internals\construction.py", line 520, in nested_data_to_arrays arrays, columns = to_arrays(data, columns, dtype=dtype) ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "E:\python\Lib\site-packages\pandas\core\internals\construction.py", line 845, in to_arrays content, columns = _finalize_columns_and_data(arr, columns, dtype) ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ File "E:\python\Lib\site-packages\pandas\core\internals\construction.py", line 942, in _finalize_columns_and_data raise ValueError(err) from err ValueError: 2 columns passed, passed data had 18 columns
时间: 2025-07-08 10:12:26 浏览: 0
<think>好的,我现在需要帮助用户解决他们遇到的pandas错误。用户提供的错误信息显示在创建DataFrame时出现了列数不匹配的问题。具体来说,用户试图用两个列名但实际数据有18列。让我仔细分析一下这个问题。
首先,用户给出的代码是:df1 = pd.DataFrame([keys1,values1], columns=['<UNK>','<UNK>'])。这里用户传入了一个包含两个列表(keys1和values1)的列表作为数据,同时指定了两个列名。但错误提示说数据有18列,而用户只定义了2个列名。这说明keys1和values1可能每个都是包含多个元素的列表,导致组合后的DataFrame实际有18列。
我需要解释为什么会出现这种错误。当用户使用[pd.DataFrame([keys1,values1])]时,pandas会将每个列表作为一行。例如,如果keys1和values1都是长度为n的列表,那么DataFrame会有一个行数为2,列数为n的结构。但用户可能误解了这种结构,以为每个列表作为一列,所以错误地指定了两个列名。
举个例子,假设keys1是一个包含18个元素的列表,values1同样也是18个元素,那么当它们被组合成[[keys1], [values1]]时,实际上每个子列表作为一行,每个元素作为一列,导致结果DataFrame有两行18列。但用户指定了2列,所以pandas报错。
接下来,我需要提供解决方案。用户可能希望将keys1和values1作为两列,而不是两行。正确的做法是将数据组织为字典,或者将列表转置。例如,使用pd.DataFrame({'col1': keys1, 'col2': values1}),或者将列表合并后转置。
此外,用户可能在数据形状上存在混淆,需要明确行和列的关系。如果keys1和values1都是长度为18的列表,正确的DataFrame应该有18行两列。因此,用户需要调整数据结构,确保传入的数据是正确形状。
总结问题原因:用户错误地将两个列表作为行输入,导致列数不匹配。解决方案是改用字典或转置数组来正确构造DataFrame。</think>错误提示表明你尝试创建的 `DataFrame` 时,指定了 **2个列名**(`['<UNK>','<UNK>']`),但实际传入的数据却包含了 **18列**。根本原因是 `pandas.DataFrame` 的数据结构定义方式与你的预期不符。
---
### 错误原因
1. **数据形状与列名数量不匹配**
你传入的数据是 `[keys1, values1]`,其中 `keys1` 和 `values1` 可能是两个长度为 18 的列表。当用 `pd.DataFrame([keys1, values1])` 创建时:
- `pandas` 会将每个子列表视为 **一行**。
- 因此总数据是 **2行×18列**,但你只定义了 2 个列名,导致冲突。
2. **列名重复命名**
列名中使用了重复的 `'<UNK>'`,虽然这不是直接报错原因,但可能导致后续操作混乱。
---
### 解决方案
#### 方法 1:使用字典定义列
直接以字典形式指定列名和对应的数据列表(推荐):
```python
df1 = pd.DataFrame({
'KeyColumn': keys1, # 替换为实际列名
'ValueColumn': values1 # 替换为实际列名
})
```
- `keys1` 和 `values1` 需是等长的一维列表。
- 生成的 `DataFrame` 会有 **N行×2列**(N 为列表长度)。
#### 方法 2:转置数组
若坚持使用列表嵌套,需对数据进行转置:
```python
data = [keys1, values1] # 原始数据:2行×18列
transposed_data = list(zip(*data)) # 转置为 18行×2列
df1 = pd.DataFrame(transposed_data, columns=['Key', 'Value'])
```
#### 方法 3:检查数据来源
如果 `keys1` 或 `values1` 是从其他数据结构(如 NumPy 数组、Excel 文件)读取的,可能需要验证其形状:
```python
print(len(keys1), len(values1)) # 确保两者长度一致
```
---
### 示例对比
假设 `keys1 = ['A', 'B', 'C']`,`values1 = [1, 2, 3]`:
| 错误写法 | 结果(2行×3列) | 正确写法 | 结果(3行×2列) |
|----------|----------------|----------|----------------|
| `pd.DataFrame([keys1, values1])` | <br>0 A B C<br>1 1 2 3 | `pd.DataFrame({'Key': keys1, 'Value': values1})` | <br> Key Value<br>0 A 1<br>1 B 2<br>2 C 3 |
---
### 常见陷阱
- **行与列的混淆**:`pandas` 中列表嵌套层级决定行列方向。
- **转置方法缺失**:`zip(*data)` 是转置二维数组的常用技巧。
- **列名覆盖**:避免使用重复列名(如 `<UNK>`),否则可能导致后续操作异常。
---
阅读全文
相关推荐


















