Группировать по сумме с фильтром по сгруппированным по итогу

#python #python-3.x #pandas

#python #python-3.x #панды

Вопрос:

Если у меня есть df, как показано ниже, как:

 State | x_date    |  y_date    | z_date   | amount | date_status
NY   2019-10-24      NaN         NaN       $400      2019-05-01
NJ   2019-07-24   2019-10-24 2019-10-20     $0       2019-05-01
CA      NaN       2019-01-24     NaN       $320      2019-05-01
WA      NaN          NaN         NaN       $10       2019-05-01
WA    2018-07-10     NaN         NaN       $100      2019-05-01
WA    2018-09-10     NaN     2019-10-10    $30       2019-05-01
  

Как я могу сгруппировать по столбцу состояния и получить сумму столбца суммы / сумму суммы всех строк в группировках состояний?

Числитель должен быть сгруппирован по столбцам состояния сумма столбца суммы, только если КАКАЯ-ЛИБО из дат в x_date, y_date или z_date позже или после даты в столбце date_status

ожидаемый результат:

 State | pct 
NY      1
NJ      0
CA      0
WA     .21
  

где WA равно (30/140)

Спасибо!

Ответ №1:

Довольно просто:

 filtered_df = df[
    (df['x_date'] >= df['date_status']) 
    | (df['y_date'] >= df['date_status'])
    | (df['z_date'] >= df['date_status'])
]
result = (
    filtered_df.groupby('State').amount.sum()
    / df.groupby('State').amount.sum()
).fillna(0)
  

Результат:

 State
CA    0.000000
NJ    0.000000
NY    1.000000
WA    0.214286
Name: amount, dtype: float64