假设我有以下数据框:
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之间的间隙。
答案 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]