python将距离计算为列中的一个数字

python将距离计算为列中的一个数字,python,pandas,Python,Pandas,我有一个数据帧df,其中有一个整数列“X” df = pd.DataFrame({'X': [7, 2, 0, 3, 4, 2, 5, 0, 3, 4]}) 我需要为df中的每个值计算到前一个零的距离 因此,预期的产出将是 op = pd.DataFrame({'dist': [0 ,0, 0, 1, 2, 3, 4, 0, 1, 2]}) 我能够执行for循环并实现逻辑,但我想还有一种更为类似python的方法,但我缺少这种方法。使用: g = df['X'].eq(0).cumsum()

我有一个数据帧df,其中有一个整数列“X”

df = pd.DataFrame({'X': [7, 2, 0, 3, 4, 2, 5, 0, 3, 4]})
我需要为df中的每个值计算到前一个零的距离

因此,预期的产出将是

op = pd.DataFrame({'dist': [0 ,0, 0, 1, 2, 3, 4, 0, 1, 2]})
我能够执行for循环并实现逻辑,但我想还有一种更为类似python的方法,但我缺少这种方法。

使用:

g = df['X'].eq(0).cumsum()
df['dist'] = np.where(g.eq(0), 0, df.groupby(g).cumcount())
print (df)
   X  dist
0  7     0
1  2     0
2  0     0
3  3     1
4  4     2
5  2     3
6  5     4
7  0     0
8  3     1
9  4     2
说明

  • 首先比较
    0
    和(
    =
  • 将累计总和加上
  • 按创建每个组的计数器
  • 在第一组
    0
    0之前测试第一组
    g
  • 通过创建新列
  • print (df.assign(mask = df['X'].eq(0),
                     g = df['X'].eq(0).cumsum(),
                     counter = df.groupby(g).cumcount(),
                     mask1 = g.eq(0),
                     dist = np.where(g.eq(0), 0, df.groupby(g).cumcount())))
    
       X   mask  g  counter  mask1  dist
    0  7  False  0        0   True     0
    1  2  False  0        1   True     0
    2  0   True  1        0  False     0
    3  3  False  1        1  False     1
    4  4  False  1        2  False     2
    5  2  False  1        3  False     3
    6  5  False  1        4  False     4
    7  0   True  2        0  False     0
    8  3  False  2        1  False     1
    9  4  False  2        2  False     2