根据其他两个数据框列中的值条件创建新列

时间:2019-03-20 06:36:08

标签: python pandas dataframe conditional

我是python的新手。我感觉有一个快速解决的方法,但是对我而言似乎还没有快速解决方法。

我有一个超过150,000行的数据帧data。其中有两个系列:gridcodeCH4_Flux等。我想创建一个名为category的新类别列,该列根据此处显示的四个条件为每行分配一个类别标识符:

cat1 = data[(data.gridcode <= threshAV) & (data.CH4_Flux >= threshAM)]
cat2 = data[(data.gridcode >= threshAV) & (data.CH4_Flux >= threshAM)]
cat3 = data[(data.gridcode <= threshAV) & (data.CH4_Flux <= threshAM)]
cat4 = data[(data.gridcode >= threshAV) & (data.CH4_Flux <= threshAM)]

其中threshAVgridcode的预定阈值,而threshAMCH4_Flux的预定阈值。本质上,两者都超过了阈值,都没有超过,或者一个或另一个都超过了。优选地,类别标签将分别是分别遵循以上cat1cat2cat3cat4的逻辑的整数1、2、3和4。

我尝试了for循环以及ifwhere语句,但都被淘汰了。

尝试for循环时,通常会出现错误:

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

在此先感谢您的任何建议或指导!

1 个答案:

答案 0 :(得分:0)

numpy.select用于多个布尔掩码的新列:

#removed filtering by data[]
m1 = (data.gridcode <= threshAV) & (data.CH4_Flux >= threshAM)
m2 = (data.gridcode >= threshAV) & (data.CH4_Flux >= threshAM)
m3 = (data.gridcode <= threshAV) & (data.CH4_Flux <= threshAM)
m4 = (data.gridcode >= threshAV) & (data.CH4_Flux <= threshAM)

data['category'] = np.select([m1, m2, m3, m4], [1,2,3,4])

或者:

data['category'] = np.select([m1, m2, m3, m4], ['cat1','cat2','cat3','cat4'])