我有一个看起来像这样的数据框:
http://localhost:3000/authors/8/books/new
如果给定值为>>> df = pd.DataFrame( {'InLevel_03': [12, 12, 13, 12, 11,], 'InLevel_02': [11.5, 11.5, 12.5, 11.5, 10.5], 'InLevel_01': [11, 10.5, 12, 10.5, 9], 'OutLevel_01': [10.5, 10, 11.5, 10, 8.5], 'OutLevel_02': [10, 9.5, 11, 9.5, 8], 'OutLevel_03': [9.5, 9, 10, 9, 7.5]} )
>>> df
InLevel_03 InLevel_02 InLevel_01 OutLevel_01 OutLevel_02 OutLevel_03
0 12 11.5 11.0 10.5 10.0 9.5
1 12 11.5 10.5 10.0 9.5 9.0
2 13 12.5 12.0 11.5 11.0 10.0
3 12 11.5 10.5 10.0 9.5 9.0
4 11 10.5 9.0 8.5 8.0 7.5
,则我想检查是否有大于一行的给定值的间隙。例如,在第二行中,InLevel_02(11.5)和InLevel_01(10.5)之间有一个间隙11,在第5行中,InLevel_02(10.5)和InLevel_01(9.0)之间的间隙是10和9.5。 / p>
这项工作的结果如下:
0.5
我尝试将数据帧转换为数组(使用.to_records),并使用循环将每个值与其下一个值进行比较,但是当两个值之间存在多个级别时,代码变得太复杂了,我想知道如果有更有效的方法可以做到这一点。
答案 0 :(得分:1)
这是一种方法:
您可以从获取行和列的索引列表开始,从中提取计数以检查df
减去其自身的偏移版本(请参见pd.shift
)是否大于{{1 }}:
0.5
使用列表推导法从这些行和列中的值获取范围(请注意,此方法假定值在整个列中都在不断减小):
t = 0.5
# df = df.astype(float) # if it isn't already
rows, cols = np.where(df - df.shift(-1, axis = 1) > t)
# (array([1, 2, 3, 4]), array([1, 4, 1, 1]))
使用v = [np.arange(*df.iloc[r,[c+1, c]].values, step=t)[1:] for r, c in zip(rows, cols)]
# [array([11.]), array([10.5]), array([11.]), array([ 9.5, 10. ])]
从计数中创建一个新的Series
:
Counter