Вычислить расстояние между строками в пандах DataFrame - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть пандас DataFrame, заполненный нулями, за исключением некоторых значений 1.0. Для каждой строки я хочу вычислить расстояние до следующего вхождения 1.0. Есть идеи как это сделать?

входной фрейм данных:

index col1
0     0.0
1     0.0
2     0.0
3     0.0
4     1.0
5     0.0
6     0.0
7     1.0
8     0.0

Ожидаемый выходной кадр данных:

index col1
0     4.0
1     3.0
2     2.0
3     1.0
4     0.0
5     2.0
6     1.0
7     0.0
8     0.0

1 Ответ

2 голосов
/ 12 апреля 2019

Использование:

df['new'] = df.groupby(df['col1'].eq(1).iloc[::-1].cumsum()).cumcount(ascending=False)
print (df)
   col1  new
0   0.0    4
1   0.0    3
2   0.0    2
3   0.0    1
4   1.0    0
5   0.0    2
6   0.0    1
7   1.0    0
8   0.0    0

Объяснение

Сначала сравните на 1 с Series.eq:

print (df['col1'].eq(1))
0    False
1    False
2    False
3    False
4     True
5    False
6    False
7     True
8    False
Name: col1, dtype: bool

Затем поменяйте местами порядок на Series.iloc:

print (df['col1'].eq(1).iloc[::-1])
8    False
7     True
6    False
5    False
4     True
3    False
2    False
1    False
0    False
Name: col1, dtype: bool

Создание групп по Series.cumsum:

print (df['col1'].eq(1).iloc[::-1].cumsum())
8    0
7    1
6    1
5    1
4    2
3    2
2    2
1    2
0    2
Name: col1, dtype: int32

Передача групп на GroupBy.cumcount с ascending=False для подсчета со спины:

print (df.groupby(df['col1'].eq(1).iloc[::-1].cumsum()).cumcount(ascending=False))
0    4
1    3
2    2
3    1
4    0
5    2
6    1
7    0
8    0
dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...