我想使用布尔掩码索引Pandas数据帧,然后根据整数索引在过滤后的数据帧的子集中设置一个值,并将此值反映在数据帧中.也就是说,如果这对数据框架有所了解,我会很高兴.
例:
In [293]: df = pd.DataFrame({'a': [0,1,2,3,4,5,6,7],'b': [5,2],'c': [0,0]}) mask = (df['a'] < 7) & (df['b'] == 2) df.loc[mask,'c'] Out[293]: 2 0 3 0 6 0 Name: c,dtype: int64
现在我想设置过滤后的数据帧中返回的前两个元素的值.将iloc链接到上面的loc调用上可以编制索引:
In [294]: df.loc[mask,'c'].iloc[0: 2] Out[294]: 2 0 3 0 Name: c,dtype: int64
但不要分配:
In [295]: df.loc[mask,'c'].iloc[0: 2] = 1 print(df) a b c 0 0 5 0 1 1 5 0 2 2 2 0 3 3 2 0 4 4 5 0 5 5 5 0 6 6 2 0 7 7 2 0
使赋值与切片的长度相同(即= [1,1])也不起作用.有没有办法分配这些值?
解决方法
这确实有效,但有点难看,基本上我们使用从掩码生成的索引并对loc进行额外调用:
In [57]: df.loc[df.loc[mask,'c'].iloc[0:2].index,'c'] = 1 df Out[57]: a b c 0 0 5 0 1 1 5 0 2 2 2 1 3 3 2 1 4 4 5 0 5 5 5 0 6 6 2 0 7 7 2 0
所以突破以上:
In [60]: # take the index from the mask and iloc df.loc[mask,'c'].iloc[0: 2] Out[60]: 2 0 3 0 Name: c,dtype: int64 In [61]: # call loc using this index,we can now use this to select column 'c' and set the value df.loc[df.loc[mask,'c'].iloc[0:2].index] Out[61]: a b c 2 2 2 0 3 3 2 0