Pandas to_numeric(errors='coerce')未转无效值为NaN的问题排查与解决
问题原因及解决方法
错误根源
你代码里的核心问题是用错了loc的索引方式:app_metadata_df.loc["item_id"]是按行索引查找名为"item_id"的行,但你的数据集里"item_id"是列名,这导致你之前的pd.to_numeric和dropna操作根本没作用到目标列上,无效的文本值(比如"So")完全没被处理,所以后续astype(int)才会报错。
正确处理步骤
直接针对item_id列操作,步骤如下:
- 将
item_id列转换为数值类型,无效值转为NaN
app_metadata_df["item_id"] = pd.to_numeric(app_metadata_df["item_id"], errors='coerce')
(这里直接用列名索引即可,或者用app_metadata_df.loc[:, "item_id"]明确选择所有行的"item_id"列)
- 丢弃所有
item_id为NaN的行
app_metadata_df = app_metadata_df.dropna(subset=["item_id"])
(dropna的subset参数指定只检查item_id列的NaN,丢弃对应的整行,而非仅处理列数据)
- 将
item_id转换为int类型
app_metadata_df["item_id"] = app_metadata_df["item_id"].astype(int)
完整代码
app_metadata_df = pd.read_csv(app_metadata_csv_path) # 处理无效item_id app_metadata_df["item_id"] = pd.to_numeric(app_metadata_df["item_id"], errors='coerce') app_metadata_df = app_metadata_df.dropna(subset=["item_id"]) app_metadata_df["item_id"] = app_metadata_df["item_id"].astype(int)
这样就能彻底移除无效的item_id行,并将列转为正确的int类型。
内容的提问来源于stack exchange,提问作者LLL
相关产品推荐
相关产品推荐

