如何使用给定值比较数据框列?

时间:2019-01-07 10:12:41

标签: python pandas dataframe

我有一个看起来像这样的数据框:

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),并使用循环将每个值与其下一个值进行比较,但是当两个值之间存在多个级别时,代码变得太复杂了,我想知道如果有更有效的方法可以做到这一点。

1 个答案:

答案 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