эквивалентно наличию, отставанию или тому подобному в pandas - PullRequest
2 голосов
/ 03 марта 2020

Моя цель - выбрать строки, в которых сумма столбца «значение» составляет> 1000, учитывая совокупное значение для каждого месяца. Например, client1 достигает этого значения за 3 месяца, поскольку сумма значений за первые 3 месяца равна 1160, как показано в target_data. Мои намеки касались игры с группой, мне было интересно также использовать фильтр или сдвиг, но я сложен. В "target_data" я показываю желаемый результат



raw_data = {'client': ['client1','client1','client1','client1','client2','client2','client2','client2','client2'],
'month': [1,2,3,4,1,2,3,4,5],
'value': [10,350,800,400,300,300,300,300,10]}

df = pd.DataFrame(raw_data, columns = ['client','month','value'])
df

target_data = {'client': ['client1','client2'],
'month': [3,4],
'value': [800,300],
'cumulative': [1160,1200]}


df2 = pd.DataFrame(target_data, columns = ['client','month','value','cumulative'])

df2


df_grouped = df.groupby(['client'])['value'].sum().reset_index(name='sum_value')


df_grouped.loc[df_grouped['sum_value'] > 1000]

1 Ответ

2 голосов
/ 03 марта 2020

Вы можете использовать groupby и cumsum здесь, чтобы создать Series кумулятивных сумм. Затем используйте gt (больше чем) и idxmax, чтобы получить первый индекс, где выполняется условие, мы будем использовать loc для отфильтруйте эти индексы и, наконец, присвойте накопленную сумму обратно с помощью assign:

s_cum = df.groupby('client')['value'].cumsum() 
df.loc[s_cum.gt(1000).groupby(df['client']).idxmax()].assign(cumulative=s_cum)

[out]

    client  month  value  cumulative
2  client1      3    800        1160
7  client2      4    300        1200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...