我是python的新手。我感觉有一个快速解决的方法,但是对我而言似乎还没有快速解决方法。
我有一个超过150,000行的数据帧data
。其中有两个系列:gridcode
和CH4_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)]
其中threshAV
是gridcode
的预定阈值,而threshAM
是CH4_Flux
的预定阈值。本质上,两者都超过了阈值,都没有超过,或者一个或另一个都超过了。优选地,类别标签将分别是分别遵循以上cat1
,cat2
,cat3
和cat4
的逻辑的整数1、2、3和4。
我尝试了for
循环以及if
和where
语句,但都被淘汰了。
尝试for
循环时,通常会出现错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
在此先感谢您的任何建议或指导!
答案 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'])