Pandas拼接DataFrame时触发NotImplementedError问题求助
Pandas拼接独热编码DataFrame触发NotImplementedError解决方法
问题场景
有一个包含CITY列(存储城市名称)的Pandas DataFrame,先执行独热编码:
dummy_CITY = pd.get_dummies(df['CITY'], drop_first=False) dummy_CITY.head()
尝试拼接原DataFrame和编码结果时:
df_cat = pd.concat([df, dummy_CITY])
触发NotImplementedError,报错栈如下:
NotImplementedError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_8620/1976427847.py in <module> ----> 1 df_cat = pd.concat([df, dummy_CITY]) ~\anaconda3\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs) 309 stacklevel=stacklevel, 310 ) --> 311 return func(*args, **kwargs) 312 313 return wrapper ~\anaconda3\lib\site-packages\pandas\core\reshape\concat.py in concat(objs, axis, join, ignore_index, keys, levels, names, verify_integrity, sort, copy) 305 ) 306 --> 307 return op.get_result() 308 309 ~\anaconda3\lib\site-packages\pandas\core\reshape\concat.py in get_result(self) 530 mgrs_indexers.append((obj._mgr, indexers)) 531 --> 532 new_data = concatenate_managers( 533 mgrs_indexers, self.new_axes, concat_axis=self.bm_axis, copy=self.copy 534 ) ~\anaconda3\lib\site-packages\pandas\core\internals\concat.py in concatenate_managers(mgrs_indexers, axes, concat_axis, copy) 224 fastpath = blk.values.dtype == values.dtype 225 else: --> 226 values = _concatenate_join_units(join_units, concat_axis, copy=copy) 227 fastpath = False 228 ~\anaconda3\lib\site-packages\pandas\core\internals\concat.py in _concatenate_join_units(join_units, concat_axis, copy) 486 487 has_none_blocks = any(unit.block is None for unit in join_units) --> 488 upcasted_na = _dtype_to_na_value(empty_dtype, has_none_blocks) 489 490 to_concat = [ ~\anaconda3\lib\site-packages\pandas\core\internals\concat.py in _dtype_to_na_value(dtype, has_none_blocks) 546 elif dtype.kind == "O": 547 return np.nan --> 548 raise NotImplementedError 549 550 NotImplementedError:
已知两个DataFrame行数匹配,预期正常拼接。
问题原因
pd.concat()默认使用axis=0(行方向拼接),会把两个DataFrame的行堆叠在一起。这种情况下,若列结构差异大且存在无法兼容的数据类型,就会触发该报错。而实际需求是列方向拼接,把独热编码的列追加到原DataFrame右侧。
解决方法
方法1:修改concat的axis参数
将axis设置为1,指定按列拼接:
df_cat = pd.concat([df, dummy_CITY], axis=1)
方法2:直接在原DataFrame生成独热编码
使用pd.get_dummies的columns参数直接对原DataFrame的CITY列编码,无需额外拼接步骤:
df_cat = pd.get_dummies(df, columns=['CITY'], drop_first=False, prefix='CITY')
内容的提问来源于stack exchange,提问作者Rajarshi
相关产品推荐
相关产品推荐

