Python如何将DataFrame每行指定列之后的所有值设置为0
实现方法
你可以结合numpy的广播特性生成布尔掩码,再批量赋值,性能远高于逐行遍历:
步骤说明
- 首先提取要处理的数值列(即列名是1~8的列),将列名转为整数类型和
Select列的值做匹配 - 生成掩码:数值列的列序号大于当前行
Select值的位置即为需要置0的位置 - 直接对掩码位置赋值为0即可
代码示例
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({ '1': [54,36,34,35,27], '2': [33,54,29,19,39], '3': [46,32,11,22,43], '4': [23,14,14,45,22], '5': [35,32,21,55,22], '6': [22,21,29,16,24], '7': [36,54,33,21,22], '8': [36,55,46,74,55], 'Select': [3,4,6,5,3], 'Value': [46,14,29,55,43] }) # 提取要处理的数值列(列名1~8) num_cols = [str(i) for i in range(1,9)] # 将列名转成整数,和Select列做广播比较,生成需要置0的掩码 mask = np.arange(1,9) > df['Select'].values[:, None] # 赋值为0 df.loc[:, num_cols] = df.loc[:, num_cols].where(~mask, 0) print(df)
代码说明
np.arange(1,9)生成的是数值列对应的序号[1,2,3,4,5,6,7,8]df['Select'].values[:, None]把Select列从一维数组转成二维列向量,利用numpy广播特性逐行比较,得到的mask是和数值列形状完全一致的布尔数组,True的位置就是需要置0的位置where方法保留mask为False位置的原值,mask为True的位置替换为0
内容的提问来源于stack exchange,提问作者LostinSpatialAnalysis
相关产品推荐
相关产品推荐

