Python “代码外观”;“不是蟒蛇式的”嵌套的np.where()将列添加到pd.dataframe
我有一个pd数据框,其中包括COMPTOAL和CompFreq列 我想添加第三列-NormalizedAnnualCompensation,它使用以下逻辑 如果CompFreq为年度,则使用CompTotal中的现有值 如果CompFreq为每月一次,则将CompTotal中的值乘以12 如果CompFreq为每周,则将CompTotal中的值乘以52 我最终使用Python “代码外观”;“不是蟒蛇式的”嵌套的np.where()将列添加到pd.dataframe,python,pandas,dataframe,numpy,Python,Pandas,Dataframe,Numpy,我有一个pd数据框,其中包括COMPTOAL和CompFreq列 我想添加第三列-NormalizedAnnualCompensation,它使用以下逻辑 如果CompFreq为年度,则使用CompTotal中的现有值 如果CompFreq为每月一次,则将CompTotal中的值乘以12 如果CompFreq为每周,则将CompTotal中的值乘以52 我最终使用np.where()基本上编写了一个嵌套的if语句,就像我习惯于在excel中拼凑在一起一样(通常对编码来说是非常陌生的)——如下所示
np.where()
基本上编写了一个嵌套的if语句,就像我习惯于在excel中拼凑在一起一样(通常对编码来说是非常陌生的)——如下所示
我的问题是——我能做得更好吗?根据我所读到的和目前为止所学的,我觉得这并不是一个很好的解释
df['NormalizedAnnualCompensation'] = np.where(df['CompFreq']=='Yearly',df.CompTotal,
(np.where(df['CompFreq']=='Monthly', df.CompTotal * 12,
(np.where(df['CompFreq']=='Weekly',df.CompTotal *52,'NA')
))))
提前感谢。做事没有“正确”的方法,所以你已经找到了正确的方法 尽管如此,您仍然可以通过询问不同的方法来学习(尽管这可能超出了stackoverflow的意图范围)
例如,您可以考虑只使用掩码和只访问数据框的某个特定区域来使用大熊猫():< /P>
如果您只想比较该列以获得相等值,并且每一个实例都填充一个固定值(即COMPUTE是整个数据框上的常数),那么您可以简单地考虑使用PD.SerielMax,比较下面的最小示例实现类似的事情:
In [1]: pd.Series(np.random.randint(4, size=10)).map({0: "zero", 1: "one", 2: "two"}).fillna(
...: "NA"
...: )
Out[1]:
0 NA
1 two
2 NA
3 zero
4 two
5 zero
6 one
7 two
8 NA
9 two
dtype: object
np.where()
适用于简单的if-then-else处理。但是,如果要测试多个条件,嵌套np.where()
将看起来复杂且难以读取。在这种情况下,您可以使用以下方法获得更干净、更可读的代码:
condlist = [df['CompFreq']=='Yearly', df['CompFreq']=='Monthly', df['CompFreq']=='Weekly']
choicelist = [df.CompTotal, df.CompTotal * 12, df.CompTotal * 52]
df['NormalizedAnnualCompensation'] = np.select(condlist, choicelist, default='NA')
condlist = [df['CompFreq']=='Yearly', df['CompFreq']=='Monthly', df['CompFreq']=='Weekly']
choicelist = [df.CompTotal, df.CompTotal * 12, df.CompTotal * 52]
df['NormalizedAnnualCompensation'] = np.select(condlist, choicelist, default='NA')