выполните итерацию по определенному столбцу до определенного значения в панд

#python #pandas #dataframe #sum #iteration

Вопрос:

 A = pd.DataFrame({"type":['a','b','c', 'd','e'], "cost basis":[50, 40, 30, 20, 10], "value":[5, 25, 40, 10, 20]})
 

Я ищу, чтобы выполнить итерацию по столбцу «значение» до определенного значения или суммы в порядке убывания. Допустим, 50, тогда как если следующее число превысит это значение, то итерация на этом остановится.

Комментарии:

1. Каков ваш ожидаемый результат от данного кадра данных?

2. Для этого примера давайте просто скажем 50. Таким образом, повторяя столбец значения в порядке убывания до 50, затем каждая из этих строк в кадре данных до этого значения будет добавлена в новый кадр данных. Это для проекта по бухгалтерскому учету, над которым я работаю, поэтому я фильтрую набор данных для продажи конкретных налоговых лотов.

Ответ №1:

Не уверен, что вы этого хотите, но если я правильно понимаю:

Попробуйте через cumsum() :

 out=A.loc[A['value'].cumsum().le(50)]
 

или

Если хотите в порядке убывания, то используйте sort_values() cumsum() :

 out=A.loc[A.sort_values('value',ascending=False,ignore_index=True)['value'].cumsum().le(50)]
 

Ответ №2:

Этого можно достичь с помощью двух функций: cumsum и argmax

 import numpy as np
import pandas as pd
A = pd.DataFrame({"type":['a','b','c', 'd','e'], "cost basis":[50, 40, 30, 20, 10], "value":[5, 25, 40, 10, 20]})

# Cummulated sum of array A
acumsum = np.cumsum(A.value.values)

# Determine the first index where the value is greater than 50:
idx = np.argmax(acumsum > 50)

print(idx)