熊猫:如果下一列的行包含特定值,则将列数据除以数字

时间:2019-07-31 21:56:48

标签: python pandas dataframe

我有一个由三列组成的数据框

qty     unit_of_measure     qty_cal
3          nodes               nan
4          nodes               nan  
5          nodes               nan
6          cores               nan
7          nodes               nan
10         cores               nan  
3          nodes               nan

我想添加一个条件来填充 qty_cal

条件是,如果unit_of_measure等于“ nodes”,则将qty的行值填充到qty_cal

如果它是“核心”,则将数量值除以16,然后填充数量ty_cal

我尝试过的代码是

if ppn_df['unit_of_measure'] == 'Nodes': 
    ppn_df['qty'] 

elif ppn_df['unit_of_measure'] =='Cores':
    ppn_df['qty'] / 16 

我遇到了一个错误

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我不确定为什么会出现此值错误。我不明白为什么if语句不明确。

有人可以解释吗?

2 个答案:

答案 0 :(得分:4)

使用np.where

df['qty_cal'] = np.where(df['unit_of_measure'] == 'nodes', df['qty'], df['qty']/16)

答案 1 :(得分:1)

语句ppn_df['unit_of_measure']返回一个包含所有值的系列(一列),而不是单个项目。一种实现方法是使用applymap

尝试一下

ppn_df.qty_cal = ppn_df.apply(lambda x: x['qty'] if x['unit_of_measure'] == 'nodes' else x['qty'] / 16, axis=1)

此函数将对系列中的每一行执行lambda函数