如何使用pandas将满足条件的列的值乘以多?
df['res'] = ((df['value']<=3) & (df['value']>=1)) * 1.5 *df['value']
df['res'] = ((df['value']<=7) & (df['value']>=4)) * 1.3 *df['value']
以上是我尝试过的。但是,我一直收到消息:
试图在DataFrame的切片副本上设置一个值。尝试使用.loc [row_indexer,col_indexer] = value代替“
当我尝试具有两个以上条件时,“ res”变为0。
以下是我希望实现的目标:
value res
2 3
6 7.8
答案 0 :(得分:3)
您会混淆两种对象:掩码,它们是布尔序列,而数据框的原始列是具有数值的序列。
这应该可以解决问题:
mask1 = (df['value']<=3) & (df['value']>=1)
mask2 = (df['value']<=7) & (df['value']>=4)
df.loc[mask1, 'res'] = df['value'] * 1.5
df.loc[mask2, 'res'] = df['value'] * 1.3
print(df)
value res
0 2 3.0
2 6 7.8
答案 1 :(得分:2)
您可以使用以下方法获取范围:
df['res'] = df['value'].between(1, 3, inclusive=True)
在此包含在内,可确定是否应包括端点。
答案 2 :(得分:1)
我建议使用.between
方法来创建这样的掩码,即:
df.loc[df['value'].between(1,3), 'res'] = df[ df['value'].between(1,3), 'value'] * 1.5
df.loc[df['value'].between(4,7), 'res'] = df[ df['value'].between(4,7), 'value'] * 1.3
或者,您也可以使用np.where
函数,该函数充当if-else:
df['res'] = np.where(df['value'].between(1,3),
df['value'] * 1.5,
np.where(df['value'].between(4,7),
df['value'] * 1.3,
df['value']))