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
相关产品推荐
相关产品推荐

