You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按类别赋值:为指定城市标记1/0的技术实现问询

解决DataFrame新增标记列的问题

嘿,我瞅出来你原代码里的小问题啦——你用df.loc[df['city'].isin(['New York','Dallas','Boston'])]筛选出了符合条件的行,但np.where需要的是和原DataFrame行数完全一致的布尔数组,而不是筛选后的子集,这会导致赋值时出现长度不匹配的错误,甚至可能出现大量缺失值,毕竟你的数据有320万条呢!

给你几个高效的正确实现方法,都是针对大数据量优化的:

方法1:修正你的np.where写法

直接用整个city列的isin结果作为判断条件,不用额外的loc筛选:

import numpy as np
import pandas as pd

# 假设你的DataFrame名为df
df['present'] = np.where(df['city'].isin(['New York', 'Dallas', 'Boston']), 1, 0)

df['city'].isin(...)会返回一个和原DataFrame行数相同的布尔Series,每一行对应city是否在目标列表里,np.where会逐一判断并返回1或0,完美适配320万行的数据。

方法2:更简洁的布尔转整数法

Pandas里的布尔值可以直接转成整数(True→1,False→0),这个方法比np.where更简洁高效:

df['present'] = df['city'].isin(['New York', 'Dallas', 'Boston']).astype(int)

矢量化操作对大数据量友好,处理320万行完全没压力。

方法3:灵活的映射法(适合后续扩展)

如果以后需要修改标记值或者添加更多城市,用map会更灵活:

# 定义城市到标记的映射
city_mapping = {'New York': 1, 'Dallas': 1, 'Boston': 1}
# 映射后给不在列表里的城市填充0,转成整数
df['present'] = df['city'].map(city_mapping).fillna(0).astype(int)

小提示

因为你的数据量很大,尽量避免用apply或者循环处理,上面的三种方法都是矢量化操作,性能会比循环好很多哦!

内容的提问来源于stack exchange,提问作者John Davis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:30:46