У меня есть DataFrame с одним столбцом с положительными и отрицательными целыми числами. Для каждой строки я хотел бы видеть, сколько последовательных строк (начиная с текущей строки и включая ее) имеют отрицательные значения.Проверка последующих значений в DataFrame
Так что если последовательность была 2, -1, -3, 1, -1
, результатом будет 0, 2, 1, 0, 1
.
Я могу сделать это, итерируя все индексы, используя .iloc
, чтобы разделить столбец, и next()
, чтобы узнать, где следующее положительное значение. Но я чувствую, что это не использует возможности панды, и я думаю, что есть лучший способ сделать это. Я экспериментировал с использованием .shift()
и expanding_window
, но безуспешно.
Есть ли более «пандастический» способ узнать, сколько последовательных строк после текущего встречает какое-то логическое условие?
Вот что сейчас работает:
import pandas as pd
df = pd.DataFrame({"a": [2, -1, -3, -1, 1, 1, -1, 1, -1]})
df["b"] = 0
for i in df.index:
sub = df.iloc[i:].a.tolist()
df.b.iloc[i] = next((sub.index(n) for n in sub if n >= 0), 1)
Изменить: Я понимаю, что даже мой собственный пример не работает, когда есть больше чем один отрицательное значение в конце. Таким образом, лучшее решение становится еще более необходимым.
Изменить 2: Я изложил проблему в терминах целых чисел, но первоначально только положить 1
и -1
в моем примере. Мне нужно решить для положительных и отрицательных целых чисел вообще.
Это ближе к тому, что я собирался написать, но вы можете упростить, выполнив что-то вроде 'cumcount (восходящий = False) + 1'. Тем не менее, я слишком ленив, чтобы проверить случаи краев. :-) – DSM
@DSM Спасибо, внесли изменения. Проще и намного быстрее. – JohnE
Это отлично работает, когда DataFrame содержит только «1» и «-1», но, похоже, не работает, когда они принимают другие значения. Ошибка моя, потому что я сформулировал свой вопрос путающе - я сформулировал свою проблему в терминах целых чисел, но в примере я только положил «1» и «-1». (Я все же поддержал это, хотя, потому что он решил пример). – ASGM