Python 使用数据帧的.loc函数

Python 使用数据帧的.loc函数,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据框,其中一列是: a = [1,0,1,0,1,3,4,6,4,6] 现在,我想创建另一列,使任何大于0小于5的值都被指定为1,其余值被指定为0,即: a = [1,0,1,0,1,3,4,6,4,6] b = [1,0,1,0,1,1,1,0,1,0] 现在我已经做到了 dtaframe['b'] = dtaframe['a'].loc[0 < dtaframe['a'] < 5] = 1 dtaframe['b'] = dtaframe['a'].loc[d

我有一个熊猫数据框,其中一列是:

 a = [1,0,1,0,1,3,4,6,4,6]
现在,我想创建另一列,使任何大于0小于5的值都被指定为1,其余值被指定为0,即:

a = [1,0,1,0,1,3,4,6,4,6]
b = [1,0,1,0,1,1,1,0,1,0]
现在我已经做到了

dtaframe['b'] = dtaframe['a'].loc[0 < dtaframe['a'] < 5] = 1
dtaframe['b'] = dtaframe['a'].loc[dtaframe['a'] >4 or dtaframe['a']==0] = 0
dtaframe['b']=dtaframe['a'].loc[04或dtaframe['a']==0]=0

但是代码抛出错误。怎么办?

当使用比较运算符和布尔逻辑来过滤数据帧时,不能使用pythonic惯用法
a
。相反,您需要
(a

cond1=(0astype
将布尔值转换为0/1:

dtaframe['b'] = dtaframe['a'].between(0, 5, inclusive=False).astype(int)
结果输出:

   a  b
0  1  1
1  0  0
2  1  1
3  0  0
4  1  1
5  3  1
6  4  1
7  6  0
8  4  1
9  6  0
编辑

对于多个范围,您可以使用:

您需要注意如何定义
bin
。使用
labels=False
将返回每个bin的整数指示符,这恰好与您提供的标签相对应。您也可以手动指定每个bin的标签,例如
labels=[0,1,2]
labels=[0,17,19]
labels=['a'、'b'、'c']
等。如果手动指定标签,则可能需要使用
astype
,因为它们将作为类别返回

或者,您可以组合
loc
之间的
来手动指定每个范围:

dtaframe.loc[dtaframe['a'].between(0,1), 'b'] = 0
dtaframe.loc[dtaframe['a'].between(2,6), 'b'] = 1
dtaframe.loc[dtaframe['a'].between(7,9), 'b'] = 2
尝试以下方法:


昨天我知道了,还有myseries。在(a,b)
()@ayhan之间,我也正要把它包括进来:-)@piRSquared它似乎抛出了一些错误:('ValueError:Series的真值是不明确的。使用a.empty、a.bool()、a.item()、a.any()或a.all()’。我很抱歉。我没有注意。我想问题在于使用dtaframe['a']。loc…………你怎么说?@root-brilliant-response:)如果我要上3节课呢。比如从0-1开始分配0,2-6分配1,最后从7-9分配3。谢谢answering@AnuragPandey:我已对多个范围进行了编辑。不过,为了获得更多输入,您可能希望将其作为一个单独的问题。我的方法可能不是最优的。
dtaframe['b'] = pd.cut(dtaframe['a'], bins=[0,1,6,9], labels=False, include_lowest=True)
dtaframe.loc[dtaframe['a'].between(0,1), 'b'] = 0
dtaframe.loc[dtaframe['a'].between(2,6), 'b'] = 1
dtaframe.loc[dtaframe['a'].between(7,9), 'b'] = 2
dtaframe['b'] = np.where(([dtaframe['a'] > 4) | (dtaframe['a']==0),0, dtaframe['a'])