Как рассчитать совокупное количество последовательных значений 0 или NaN после условия в пандах?Python

Программы на Python
Ответить
Anonymous
 Как рассчитать совокупное количество последовательных значений 0 или NaN после условия в пандах?

Сообщение Anonymous »

Мне нужна помощь в создании нового столбца в моем DataFrame, который подсчитывает последовательные строки, где утвержденная_сумма равна 0 или NaN. Условия для этого расчета следующие:
Начинайте подсчет только после первого появления утвержденной суммы > 0 для каждого идентификатора. Некоторые идентификаторы изначально имеют только значения NaN, которые следует игнорировать до тех пор, пока не произойдет первое положительное утверждение.
Сброс счетчика в значение NaN после последнего утвержденного_значения > 0. Некоторые идентификаторы перестают выполнять утверждения и только регистрируются. NaN потом. В данном случае я хочу, чтобы в параметре последовательный_нулевой_approved_amount отображалось значение NaN.


время создания
id
approved_amount
consecutive_zero_approved_amount




2019-04 -05 08:55:32
1
Нет
Нет


2019-04-05 08:55:32
2
Нет
Нет


2019-05-08 10:48:10
1
100
0

2019-05-08 10:48:10
2
200
0


2019-05-25 19:15:53
1
0
1


2019-05-25 19:15:53
2
1000
0


01.06.2019 12 :30:00
1
0
2


2019-06-01 12:30:00
2
Нет
Нэт


2019-06-10 14:20:15
1< /td>
Нет
Нет


2019-06-10 14 :20:15
2
Нет
Нет



Этот код наиболее полезен, но он очень медленный. Другая проблема заключается в том, что он не учитывает, когда идентификатор начался или закончился на платформе.
-> Счетчик должен начинаться только после того, как в первой строке идентификатора будет утвержденная_сумма > 0. .
-> Счетчик должен остановиться при последнем появлении идентификатора, имеющего значениеroved_amount > 0.
# Sort the DataFrame by id and creation_timestamp
df = df.sort_values(by=['id', 'creation_timestamp']).reset_index(drop=True)

# Define a function to calculate consecutive non-approved counts
def calculate_consecutive_non_approved(group):
count = 0 # Initialize counter
result = [] # To store results for this group
for amt in group['approved_amount']:
if amt > 0: # Reset counter on approved amount
count = 0
else:
count += 1
result.append(count)
return result

# Apply the function to each id group
df['consecutive_non_approved_count'] = df.groupby('id').apply(
lambda group: calculate_consecutive_non_approved(group)
).explode().astype(int).reset_index(drop=True)


Подробнее здесь: https://stackoverflow.com/questions/792 ... er-a-condi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»