Pandas如何将DataFrame中的所有数值替换为NaN
问题场景
你需要处理的DataFrame构造代码如下(注:原代码中pd.dataframe存在拼写错误,pandas的DataFrame类名首字母需大写,正确写法为pd.DataFrame):
import pandas as pd import numpy as np data = {'Region': ['Africa','Africa','Africa','Africa','Africa','Africa','Africa','Africa','Asia','Asia','Asia','Asia'], 'Country': ['South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','Japan','Japan','Japan','Japan'], 'Product': ['ABC','ABC','ABC','ABC','XYZ','XYZ','XYZ','XYZ','DEF','DEF','DEF','DEF'], 'Year': [2016, 2017, 2018, 2019,2016, 2017, 2018, 2019,2016, 2017, 2018, 2019], 'Price': [500, 400, 0,450,750,0,0,890,0,0,415,0], 'Quantity': [1200,1700,0,330,500,0,0,120,300,0,50,0], 'Value': [600000,680000,0,148500,350000,0,0,106800,0,0,20750,0]} df = pd.DataFrame(data)
需求为将Year、Price、Quantity、Value四列的所有数值统一替换为空值。
最优实现方法
直接对目标列批量赋值空值是效率最高的方案,属于pandas原生向量化操作,没有逐元素、逐行遍历的额外开销,即使是百万行级别的数据集也能毫秒级完成:
# 定义需要替换值的目标列列表 target_columns = ['Year', 'Price', 'Quantity', 'Value'] # 批量将目标列所有值设为NaN df[target_columns] = np.nan
执行后可以得到如下结果,非目标列的原有文本数据会完整保留,目标列所有值均变为NaN:
Region Country Product Year Price Quantity Value 0 Africa South Africa ABC NaN NaN NaN NaN 1 Africa South Africa ABC NaN NaN NaN NaN 2 Africa South Africa ABC NaN NaN NaN NaN 3 Africa South Africa ABC NaN NaN NaN NaN 4 Africa South Africa XYZ NaN NaN NaN NaN 5 Africa South Africa XYZ NaN NaN NaN NaN 6 Africa South Africa XYZ NaN NaN NaN NaN 7 Africa South Africa XYZ NaN NaN NaN NaN 8 Asia Japan DEF NaN NaN NaN NaN 9 Asia Japan DEF NaN NaN NaN NaN 10 Asia Japan DEF NaN NaN NaN NaN 11 Asia Japan DEF NaN NaN NaN NaN
- 补充说明:如果不想导入numpy库,也可以直接使用pandas内置的空值类型
pd.NA赋值,效果完全一致:df[target_columns] = pd.NA - 避坑提示:不要使用
replace()、apply()、循环逐行赋值这类方法实现该需求,这类方法会产生大量额外性能损耗,数据量较大时执行速度会明显下降。
内容的提问来源于stack exchange,提问作者A.N.
相关产品推荐
相关产品推荐

