如何解决.apply()函数中新增downloads列的棘手语法错误?
修正你的安装量分组代码问题
先帮你梳理下原代码里的几个核心问题:
- 重复赋值覆盖数据:你每次给
df['downloads']赋值都会覆盖之前的结果,最后只会保留最后一行的判断,完全达不到分组的目的; - 语法与方法误用:单个字符串不能用
isin()(这是Pandas Series专属方法),应该用in判断是否在列表里,而且每个lambda的括号都没闭合,缺少必要的语法结构; - 缺少兜底逻辑:如果出现不在分组列表里的异常值,你的代码会返回
None,容易留下缺失值; - 数据集使用错误:你先读取了
googleplaystore.csv到fear,但后面又新建了一个仅包含Install值的df,应该直接用读取的真实数据集处理。
下面给你两种靠谱的修正方案:
方案1:用自定义函数+apply(直观易读)
这种方式逻辑清晰,适合小数据集或者需要调试的场景:
import pandas as pd # 读取目标数据集 df = pd.read_csv('googleplaystore.csv', encoding='latin') # 定义安装量分组映射逻辑 def map_download_category(install_str): if install_str in ['0+', '1+', '5+', '10+', '50+', '100+', '500+']: return '0-1k' elif install_str in ['1,000+', '5,000+', '10,000+', '50,000+']: return '1k-100k' elif install_str in ['100,000+', '500,000+']: return '100k-1M' elif install_str in ['1,000,000+', '5,000,000+']: return '1M-10M' elif install_str in ['10,000,000+', '50,000,000+']: return '10M-100M' elif install_str in ['100,000,000+', '500,000,000+']: return '100M-1B' elif install_str in ['1,000,000,000+']: return '> 1B' else: return 'Unknown' # 兜底处理异常值 # 应用规则生成新列 df['downloads'] = df['Install'].apply(map_download_category)
方案2:用np.select(高效适合大数据集)
如果你的数据集条目很多,用np.select的运行速度会比apply快不少:
import pandas as pd import numpy as np df = pd.read_csv('googleplaystore.csv', encoding='latin') # 定义分组条件与对应标签 conditions = [ df['Install'].isin(['0+', '1+', '5+', '10+', '50+', '100+', '500+']), df['Install'].isin(['1,000+', '5,000+', '10,000+', '50,000+']), df['Install'].isin(['100,000+', '500,000+']), df['Install'].isin(['1,000,000+', '5,000,000+']), df['Install'].isin(['10,000,000+', '50,000,000+']), df['Install'].isin(['100,000,000+', '500,000,000+']), df['Install'].isin(['1,000,000,000+']) ] category_labels = [ '0-1k', '1k-100k', '100k-1M', '1M-10M', '10M-100M', '100M-1B', '> 1B' ] # 生成新列,异常值默认标记为Unknown df['downloads'] = np.select(conditions, category_labels, default='Unknown')
额外提醒:
- 两种方案都加了
Unknown兜底,避免出现缺失值; - 方案2里用
df['Install'].isin()是因为处理的是Series对象,和单个字符串的判断逻辑不同; - 记得导入完整的
pandas和(方案2需要的)numpy,原代码只导入DataFrame却用pd会直接报错。
内容的提问来源于stack exchange,提问作者BrowsingATM
相关产品推荐
相关产品推荐

