如何计算pandas数据帧中两个或多个非零元素之间的最小差距?

时间:2017-07-23 07:01:13

标签: python pandas

假设我有以下数据框:

   C1 C2 C3 C4  
0  1  2  3  0  
1  4  0  3  0  
2  2  0  0  3  
3  0  3  0  3   

然后我想添加另一列,使其显示最小间隙(间隙是两个非零元素之间的零元素数)。如果没有这样的间隙,则输出将为0.该列将如下所示:

  Cnew  
0 0  
1 1  
2 2  
3 1  

第一行没有差距。第二行在4和3之间有一个间隙。第三行在2和3之间有两个间隙。第四行有3和3之间的间隙。

1 个答案:

答案 0 :(得分:2)

您可以找到np.where的非零位置,并获取这些位置的差异。最大差异比差距大一个。

[np.diff(np.where(x)[0]).max() - 1 for x in df.values]

[0, 1, 2, 1]

您可以将其添加到df assign

的副本中
df.assign(Cnew=[np.diff(np.where(x)[0]).max() - 1 for x in df.values])

   C1  C2  C3  C4  Cnew
0   1   2   3   0     0
1   4   0   3   0     1
2   2   0   0   3     2
3   0   3   0   3     1

或者添加列

df['Cnew'] = [np.diff(np.where(x)[0]).max() - 1 for x in df.values]
df

   C1  C2  C3  C4  Cnew
0   1   2   3   0     0
1   4   0   3   0     1
2   2   0   0   3     2
3   0   3   0   3     1

为了在一行中有一个或零个非零的情况下使这个健壮,我们可以定义一个函数来处理这些情况

def biggest_gap(x):
    d = np.diff(np.where(x)[0])
    if bool(d.tolist()):
        return d.max() - 1
    else:
        return 0

然后像这样使用它

[biggest_gap(x) for x in df.values]

[0, 1, 2, 1]