Как рассчитать совокупное количество последовательных значений 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:101
100
0


2019-05-08 10:48:10
2
200
< td>0


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


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


2019-06-01 12:30:00
10
2


01.06.2019 12:30:00
2
Нет
Нет
< /tr>

2019-06-10 14:20:15
1
Нэт
Нет


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



РЕДАКТИРОВАТЬ: Кажется, этот код работает, но он мучительно медленный.
# 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
started_counting = False # Flag to indicate if we started counting

for amt in group['approved_amount']:
if amt > 0:
if not started_counting:
started_counting = True # Start counting after first approved amount
count = 0 # Reset counter on approved amount
elif started_counting:
count += 1 # Increment counter only if we have started counting
result.append(count if started_counting else None) # Append count or None if not started
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(float).reset_index(drop=True)

# Drop rows after the last approved_amount > 0 for each ID
def drop_after_last_approved(group):
last_approved_index = group[group['approved_amount'] > 0].index.max()
return group.loc[:last_approved_index]

df = df.groupby('id').apply(drop_after_last_approved).reset_index(drop=True)


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

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

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

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

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

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