如何在Pandas DataFrame中创建包含元组的列?
解决Pandas中创建含元组列的ValueError问题
问题场景
尝试在Pandas DataFrame中创建包含元组的列时,使用NumPy数组构建数据触发ValueError,错误提示为Must pass 2-d input. shape=(2, 1, 2)。同时测试了单元素元组的构建场景,需解决该错误。
报错代码
# 创建NumPy数组 array = np.array([[('A' , 1)], [('B' , 2)]]) # 索引名称列表 index_values = ['x1', 'x2'] # 列名称列表 column_values = ['(a,b)'] # 创建DataFrame df = pd.DataFrame(data = array, index = index_values, columns = column_values) df
报错信息
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) /tmp/ipykernel_45/2020978637.py in <module> 13 df = pd.DataFrame(data = array, 14 index = index_values, ---> 15 columns = column_values) 16 17 df /opt/oss/conda3/lib/python3.7/site-packages/pandas/core/frame.py in __init__(self, data, index, columns, dtype, copy) 676 dtype=dtype, 677 copy=copy, ---> 678 typ=manager, 679 ) 680 /opt/oss/conda3/lib/python3.7/site-packages/pandas/core/internals/construction.py in ndarray_to_mgr(values, index, columns, dtype, copy, typ) 302 # by definition an array here 303 # the dtypes will be coerced to a single dtype ---> 304 values = _prep_ndarray(values, copy=copy) 305 306 if dtype is not None and not is_dtype_equal(values.dtype, dtype): /opt/oss/conda3/lib/python3.7/site-packages/pandas/core/internals/construction.py in _prep_ndarray(values, copy) 553 values = values.reshape((values.shape[0], 1)) 554 elif values.ndim != 2: ---> 555 raise ValueError(f"Must pass 2-d input. shape={values.shape}") 556 557 return values ValueError: Must pass 2-d input. shape=(2, 1, 2)
单元素元组测试代码
array = np.array([[(1)], [(2)]])
错误原因
NumPy默认会解析元组内的元素,将外层列表[[('A',1)], [('B',2)]]转换为3维数组(shape=(2,1,2)),而Pandas DataFrame要求输入为2维结构(行×列),因此触发维度不匹配的错误。
对于单元素元组,[(1)]并非合法元组(只是整数1),正确的单元素元组写法应为[(1,)],否则会被NumPy解析为普通数值类型。
解决方案
方案1:直接使用Python列表构建DataFrame
跳过NumPy数组,直接用列表传递数据,Python列表会保留元组作为单个元素:
data = [[('A', 1)], [('B', 2)]] index_values = ['x1', 'x2'] column_values = ['(a,b)'] df = pd.DataFrame(data=data, index=index_values, columns=column_values)
方案2:指定NumPy数组的dtype为object
如果必须使用NumPy数组,需显式指定dtype=object,让NumPy将元组视为单个对象,避免自动展开:
array = np.array([[('A', 1)], [('B', 2)]], dtype=object) index_values = ['x1', 'x2'] column_values = ['(a,b)'] df = pd.DataFrame(data=array, index=index_values, columns=column_values)
单元素元组的处理
确保单元素元组的正确写法(末尾加逗号),再用上述两种方案之一构建:
# 方案1:列表方式 data = [[(1,)], [(2,)]] df = pd.DataFrame(data=data, index=['x1','x2'], columns=['single_tuple']) # 方案2:NumPy object dtype方式 array = np.array([[(1,)], [(2,)]], dtype=object) df = pd.DataFrame(data=array, index=['x1','x2'], columns=['single_tuple'])
内容的提问来源于stack exchange,提问作者blue-sky
相关产品推荐
相关产品推荐

