指定dtype时如何处理Pandas DataFrame重复列问题
重复列名场景下指定DataFrame dtype的解决方案
问题重现
当创建包含重复列名的DataFrame时,直接通过字典给dtype参数赋值会触发类型错误:
正常创建重复列DataFrame:
import pandas as pd df = pd.DataFrame([['A','B']], columns=['A','A'])
尝试指定dtype时报错:
df = pd.DataFrame([['A','B']], columns=['A','A'], dtype={'A':str})
错误栈:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/anaconda3/lib/python3.7/site-packages/pandas/core/frame.py", line 513, in __init__ dtype = self._validate_dtype(dtype) File "/home/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py", line 345, in _validate_dtype dtype = pandas_dtype(dtype) File "/home/anaconda3/lib/python3.7/site-packages/pandas/core/dtypes/common.py", line 1799, in pandas_dtype npdtype = np.dtype(dtype) File "/home/anaconda3/lib/python3.7/site-packages/numpy/core/_internal.py", line 62, in _usefields names, formats, offsets, titles = _makenames_list(adict, align) File "/home/anaconda3/lib/python3.7/site-packages/numpy/core/_internal.py", line 30, in _makenames_list n = len(obj) TypeError: object of type 'type' has no len()
可行解决方法
方法1:创建后批量转换列类型
先完成DataFrame创建,再对所有目标列统一转换类型:
import pandas as pd df = pd.DataFrame([['A','B']], columns=['A','A']) # 遍历所有名为'A'的列,转换为str类型 for col in df.columns[df.columns == 'A']: df[col] = df[col].astype(str)
也可以通过列位置直接指定:
# 对第0列和第1列分别转换类型 df.iloc[:, 0] = df.iloc[:, 0].astype(str) df.iloc[:, 1] = df.iloc[:, 1].astype(str)
方法2:基于numpy结构化数组创建
如果需要在创建阶段就指定类型,可以借助numpy的结构化数组,重复列名通过元组定义:
import pandas as pd import numpy as np # 定义包含重复列名的结构化dtype dtype_def = [('A', 'U1'), ('A', 'U1')] # 构造numpy结构化数组 data = np.array([('A', 'B')], dtype=dtype_def) # 转换为DataFrame df = pd.DataFrame(data)
方法3:读取外部数据时指定转换规则
如果是从CSV等文件读取带重复列的数据,可使用converters参数按列位置指定转换逻辑:
# 示例:读取包含重复列的CSV文件 # 假设data.csv内容为: # A,A # A,B df = pd.read_csv('data.csv', converters={0: str, 1: str})
内容的提问来源于stack exchange,提问作者ajoseps
相关产品推荐
相关产品推荐

