Примените условие к группе и заполните только несколько строк нового столбца. - PullRequest
0 голосов
/ 04 марта 2020

У меня есть данные, сгруппированные по WeekStartDt и WeekEndDt (неделя исключает субботу и воскресенье). Кадр данных сортируется в порядке убывания Amount для каждой группы недели. Я оценивал каждую групповую неделю по столбцу Row_Num. Дата в столбце BusDt - это та дата, на которую должна быть назначена наибольшая сумма вместо «Дата транзакции». Второе по величине количество должно быть присвоено BusDt + 1. Amount, соответствующее другому Transaction Dates, должно быть изменено на 0.

Я попытался использовать функцию преобразования с max, чтобы сделать это, но это добавило наибольшее количество ко всем строкам. Я не уверен, как использовать условное преобразование здесь. Любая помощь будет оценена. Заранее спасибо!

Входной кадр данных

| Row_Num | Amount | Transaction Date | WeekStartDt | WeekEndDt  | BusDt   |
|---------|--------|------------------|-------------|------------|---------|
| 1       | 349282 | 2020-02-21       | 2020-02-17  | 2020-02-21 | 2/19/20 |
| 2       | 15440  | 2020-02-18       | 2020-02-17  | 2020-02-21 | 2/19/20 |
| 3       | 6636   | 2020-02-19       | 2020-02-17  | 2020-02-21 | 2/19/20 |
| 4       | 6624   | 2020-02-17       | 2020-02-17  | 2020-02-21 | 2/19/20 |
| 5       | -1526  | 2020-02-20       | 2020-02-17  | 2020-02-21 | 2/19/20 |
| 1       | 502387 | 2020-02-26       | 2020-02-24  | 2020-02-28 | NaT     |
| 2       | 27637  | 2020-02-27       | 2020-02-24  | 2020-02-28 | NaT     |
| 3       | 9736   | 2020-02-24       | 2020-02-24  | 2020-02-28 | NaT     |
| 4       | 6671   | 2020-02-28       | 2020-02-24  | 2020-02-28 | NaT     |
| 5       | 5807   | 2020-02-25       | 2020-02-24  | 2020-02-28 | NaT     |
| 1       | 238532 | 2020-03-06       | 2020-03-02  | 2020-03-06 | 3/4/20  |
| 2       | 21399  | 2020-03-05       | 2020-03-02  | 2020-03-06 | 3/4/20  |
| 3       | 5837   | 2020-03-02       | 2020-03-02  | 2020-03-06 | 3/4/20  |
| 4       | 5683   | 2020-03-04       | 2020-03-02  | 2020-03-06 | 3/4/20  |
| 5       | 5670   | 2020-03-03       | 2020-03-02  | 2020-03-06 | 3/4/20  |
| 1       | 740786 | 2020-03-12       | 2020-03-09  | 2020-03-13 | NaT     |
| 2       | 71530  | 2020-03-13       | 2020-03-09  | 2020-03-13 | NaT     |
| 3       | 6713   | 2020-03-09       | 2020-03-09  | 2020-03-13 | NaT     |
| 4       | 5648   | 2020-03-10       | 2020-03-09  | 2020-03-13 | NaT     |
| 5       | 5571   | 2020-03-11       | 2020-03-09  | 2020-03-13 | NaT     |

Требуемый вывод

| Row_Num | Amount | Transaction Date | WeekStartDt | WeekEndDt  | BusDt      | NewAmt |
|---------|--------|------------------|-------------|------------|------------|--------|
| 1       | 349282 | 2020-02-17       | 2020-02-17  | 2020-02-21 | 2020-02-19 | 0      |
| 2       | 15440  | 2020-02-18       | 2020-02-17  | 2020-02-21 | 2020-02-19 | 0      |
| 3       | 6636   | 2020-02-19       | 2020-02-17  | 2020-02-21 | 2020-02-19 | 349282 |
| 4       | 6624   | 2020-02-20       | 2020-02-17  | 2020-02-21 | 2020-02-19 | 15440  |
| 5       | -1526  | 2020-02-21       | 2020-02-17  | 2020-02-21 | 2020-02-19 | 0      |
| 1       | 502387 | 2020-02-24       | 2020-02-24  | 2020-02-28 | NaT        | 0      |
| 2       | 27637  | 2020-02-25       | 2020-02-24  | 2020-02-28 | NaT        | 0      |
| 3       | 9736   | 2020-02-26       | 2020-02-24  | 2020-02-28 | NaT        | 0      |
| 4       | 6671   | 2020-02-27       | 2020-02-24  | 2020-02-28 | NaT        | 0      |
| 5       | 5807   | 2020-02-28       | 2020-02-24  | 2020-02-28 | NaT        | 0      |
| 1       | 238532 | 2020-03-02       | 2020-03-02  | 2020-03-06 | 2020-03-04 | 0      |
| 2       | 21399  | 2020-03-03       | 2020-03-02  | 2020-03-06 | 2020-03-04 | 0      |
| 3       | 5837   | 2020-03-04       | 2020-03-02  | 2020-03-06 | 2020-03-04 | 238532 |
| 4       | 5683   | 2020-03-05       | 2020-03-02  | 2020-03-06 | 2020-03-04 | 21399  |
| 5       | 5670   | 2020-03-06       | 2020-03-02  | 2020-03-06 | 2020-03-04 | 0      |
| 1       | 740786 | 2020-03-09       | 2020-03-09  | 2020-03-13 | NaT        | 0      |
| 2       | 71530  | 2020-03-10       | 2020-03-09  | 2020-03-13 | NaT        | 0      |
| 3       | 6713   | 2020-03-11       | 2020-03-09  | 2020-03-13 | NaT        | 0      |
| 4       | 5648   | 2020-03-12       | 2020-03-09  | 2020-03-13 | NaT        | 0      |
| 5       | 5571   | 2020-03-13       | 2020-03-09  | 2020-03-13 | NaT        | 0      |
df_grouped['NewAmt'] = df_grouped.groupby(['WeekStartDt', 'WeekEndDt'])['Amount'].transform('max')
| Row_Num | Amount | Transaction Date | WeekStartDt | WeekEndDt  | BusDt      | NewAmt |
|---------|--------|------------------|-------------|------------|------------|--------|
| 1       | 349282 | 2020-02-17       | 2020-02-17  | 2020-02-21 | 2020-02-19 | 349282 |
| 2       | 15440  | 2020-02-18       | 2020-02-17  | 2020-02-21 | 2020-02-19 | 349282 |
| 3       | 6636   | 2020-02-19       | 2020-02-17  | 2020-02-21 | 2020-02-19 | 349282 |
| 4       | 6624   | 2020-02-20       | 2020-02-17  | 2020-02-21 | 2020-02-19 | 349282 |
| 5       | -1526  | 2020-02-21       | 2020-02-17  | 2020-02-21 | 2020-02-19 | 349282 |
| 1       | 502387 | 2020-02-24       | 2020-02-24  | 2020-02-28 | NaT        | 502387 |
| 2       | 27637  | 2020-02-25       | 2020-02-24  | 2020-02-28 | NaT        | 502387 |
| 3       | 9736   | 2020-02-26       | 2020-02-24  | 2020-02-28 | NaT        | 502387 |
| 4       | 6671   | 2020-02-27       | 2020-02-24  | 2020-02-28 | NaT        | 502387 |
| 5       | 5807   | 2020-02-28       | 2020-02-24  | 2020-02-28 | NaT        | 502387 |
| 1       | 238532 | 2020-03-02       | 2020-03-02  | 2020-03-06 | 2020-03-04 | 238532 |
| 2       | 21399  | 2020-03-03       | 2020-03-02  | 2020-03-06 | 2020-03-04 | 238532 |
| 3       | 5837   | 2020-03-04       | 2020-03-02  | 2020-03-06 | 2020-03-04 | 238532 |
| 4       | 5683   | 2020-03-05       | 2020-03-02  | 2020-03-06 | 2020-03-04 | 238532 |
| 5       | 5670   | 2020-03-06       | 2020-03-02  | 2020-03-06 | 2020-03-04 | 238532 |
| 1       | 740786 | 2020-03-09       | 2020-03-09  | 2020-03-13 | NaT        | 740786 |
| 2       | 71530  | 2020-03-10       | 2020-03-09  | 2020-03-13 | NaT        | 740786 |
| 3       | 6713   | 2020-03-11       | 2020-03-09  | 2020-03-13 | NaT        | 740786 |
| 4       | 5648   | 2020-03-12       | 2020-03-09  | 2020-03-13 | NaT        | 740786 |
| 5       | 5571   | 2020-03-13       | 2020-03-09  | 2020-03-13 | NaT        | 740786 |

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Используйте один transform для самых больших значений и другой для вторых по величине значений. Передав их np.select

m = df.TransactionDate == df.BusDt
m1 = m.groupby([df.WeekStartDt, df.WeekEndDt]).shift(fill_value=False)
grps = df.groupby(['WeekStartDt', 'WeekEndDt'])
s_1st = grps['Amount'].transform('max')
s_2nd = grps['Amount'].transform(lambda x: x.nlargest(2).iloc[-1])
df['NewAmt'] = np.select([m, m1], [s_1st, s_2nd], 0)

Out[1510]:
    Row_Num  Amount TransactionDate WeekStartDt   WeekEndDt       BusDt  NewAmt
0         1  349282      2020-02-17  2020-02-17  2020-02-21  2020-02-19       0
1         2   15440      2020-02-18  2020-02-17  2020-02-21  2020-02-19       0
2         3    6636      2020-02-19  2020-02-17  2020-02-21  2020-02-19  349282
3         4    6624      2020-02-20  2020-02-17  2020-02-21  2020-02-19   15440
4         5   -1526      2020-02-21  2020-02-17  2020-02-21  2020-02-19       0
5         1  502387      2020-02-24  2020-02-24  2020-02-28         NaT       0
6         2   27637      2020-02-25  2020-02-24  2020-02-28         NaT       0
7         3    9736      2020-02-26  2020-02-24  2020-02-28         NaT       0
8         4    6671      2020-02-27  2020-02-24  2020-02-28         NaT       0
9         5    5807      2020-02-28  2020-02-24  2020-02-28         NaT       0
10        1  238532      2020-03-02  2020-03-02  2020-03-06  2020-03-04       0
11        2   21399      2020-03-03  2020-03-02  2020-03-06  2020-03-04       0
12        3    5837      2020-03-04  2020-03-02  2020-03-06  2020-03-04  238532
13        4    5683      2020-03-05  2020-03-02  2020-03-06  2020-03-04   21399
14        5    5670      2020-03-06  2020-03-02  2020-03-06  2020-03-04       0
15        1  740786      2020-03-09  2020-03-09  2020-03-13         NaT       0
16        2   71530      2020-03-10  2020-03-09  2020-03-13         NaT       0
17        3    6713      2020-03-11  2020-03-09  2020-03-13         NaT       0
18        4    5648      2020-03-12  2020-03-09  2020-03-13         NaT       0
19        5    5571      2020-03-13  2020-03-09  2020-03-13         NaT       0
0 голосов
/ 04 марта 2020

Я использовал groupby и transform, а также две вспомогательные переменные

records = [{'Row_Num': 1,
  'Amount': 349282,
  'Transaction_Date': ' 2020-02-17       ',
  'WeekStartDt': ' 2020-02-17  ',
  'WeekEndDt': ' 2020-02-21 ',
  'BusDt': ' 2020-02-19 '},
 {'Row_Num': 2,
  'Amount': 15440,
  'Transaction_Date': ' 2020-02-18       ',
  'WeekStartDt': ' 2020-02-17  ',
  'WeekEndDt': ' 2020-02-21 ',
  'BusDt': ' 2020-02-19 '},
 {'Row_Num': 3,
  'Amount': 6636,
  'Transaction_Date': ' 2020-02-19       ',
  'WeekStartDt': ' 2020-02-17  ',
  'WeekEndDt': ' 2020-02-21 ',
  'BusDt': ' 2020-02-19 '},
 {'Row_Num': 4,
  'Amount': 6624,
  'Transaction_Date': ' 2020-02-20       ',
  'WeekStartDt': ' 2020-02-17  ',
  'WeekEndDt': ' 2020-02-21 ',
  'BusDt': ' 2020-02-19 '},
 {'Row_Num': 5,
  'Amount': -1526,
  'Transaction_Date': ' 2020-02-21       ',
  'WeekStartDt': ' 2020-02-17  ',
  'WeekEndDt': ' 2020-02-21 ',
  'BusDt': ' 2020-02-19 '},
 {'Row_Num': 1,
  'Amount': 502387,
  'Transaction_Date': ' 2020-02-24       ',
  'WeekStartDt': ' 2020-02-24  ',
  'WeekEndDt': ' 2020-02-28 ',
  'BusDt': ' NaT        '},
 {'Row_Num': 2,
  'Amount': 27637,
  'Transaction_Date': ' 2020-02-25       ',
  'WeekStartDt': ' 2020-02-24  ',
  'WeekEndDt': ' 2020-02-28 ',
  'BusDt': ' NaT        '},
 {'Row_Num': 3,
  'Amount': 9736,
  'Transaction_Date': ' 2020-02-26       ',
  'WeekStartDt': ' 2020-02-24  ',
  'WeekEndDt': ' 2020-02-28 ',
  'BusDt': ' NaT        '},
 {'Row_Num': 4,
  'Amount': 6671,
  'Transaction_Date': ' 2020-02-27       ',
  'WeekStartDt': ' 2020-02-24  ',
  'WeekEndDt': ' 2020-02-28 ',
  'BusDt': ' NaT        '},
 {'Row_Num': 5,
  'Amount': 5807,
  'Transaction_Date': ' 2020-02-28       ',
  'WeekStartDt': ' 2020-02-24  ',
  'WeekEndDt': ' 2020-02-28 ',
  'BusDt': ' NaT        '},
 {'Row_Num': 1,
  'Amount': 238532,
  'Transaction_Date': ' 2020-03-02       ',
  'WeekStartDt': ' 2020-03-02  ',
  'WeekEndDt': ' 2020-03-06 ',
  'BusDt': ' 2020-03-04 '},
 {'Row_Num': 2,
  'Amount': 21399,
  'Transaction_Date': ' 2020-03-03       ',
  'WeekStartDt': ' 2020-03-02  ',
  'WeekEndDt': ' 2020-03-06 ',
  'BusDt': ' 2020-03-04 '},
 {'Row_Num': 3,
  'Amount': 5837,
  'Transaction_Date': ' 2020-03-04       ',
  'WeekStartDt': ' 2020-03-02  ',
  'WeekEndDt': ' 2020-03-06 ',
  'BusDt': ' 2020-03-04 '},
 {'Row_Num': 4,
  'Amount': 5683,
  'Transaction_Date': ' 2020-03-05       ',
  'WeekStartDt': ' 2020-03-02  ',
  'WeekEndDt': ' 2020-03-06 ',
  'BusDt': ' 2020-03-04 '},
 {'Row_Num': 5,
  'Amount': 5670,
  'Transaction_Date': ' 2020-03-06       ',
  'WeekStartDt': ' 2020-03-02  ',
  'WeekEndDt': ' 2020-03-06 ',
  'BusDt': ' 2020-03-04 '},
 {'Row_Num': 1,
  'Amount': 740786,
  'Transaction_Date': ' 2020-03-09       ',
  'WeekStartDt': ' 2020-03-09  ',
  'WeekEndDt': ' 2020-03-13 ',
  'BusDt': ' NaT        '},
 {'Row_Num': 2,
  'Amount': 71530,
  'Transaction_Date': ' 2020-03-10       ',
  'WeekStartDt': ' 2020-03-09  ',
  'WeekEndDt': ' 2020-03-13 ',
  'BusDt': ' NaT        '},
 {'Row_Num': 3,
  'Amount': 6713,
  'Transaction_Date': ' 2020-03-11       ',
  'WeekStartDt': ' 2020-03-09  ',
  'WeekEndDt': ' 2020-03-13 ',
  'BusDt': ' NaT        '},
 {'Row_Num': 4,
  'Amount': 5648,
  'Transaction_Date': ' 2020-03-12       ',
  'WeekStartDt': ' 2020-03-09  ',
  'WeekEndDt': ' 2020-03-13 ',
  'BusDt': ' NaT        '},
 {'Row_Num': 5,
  'Amount': 5571,
  'Transaction_Date': ' 2020-03-13       ',
  'WeekStartDt': ' 2020-03-09  ',
  'WeekEndDt': ' 2020-03-13 ',
  'BusDt': ' NaT        '}]

df = pd.DataFrame(records)
df[['Transaction_Date', 'WeekStartDt', 'WeekEndDt', 'BusDt']] = df[['Transaction_Date', 'WeekStartDt', 'WeekEndDt', 'BusDt']].apply(pd.to_datetime, errors='coerce')
df['NewAmt1'] = df['BusDt'].eq(df['Transaction_Date']) * df.groupby('WeekEndDt')['Amount'].transform(max)
df['NewAmt2'] = df['BusDt'].add(pd.Timedelta(days=1)).eq(df['Transaction_Date']) * df.groupby('WeekEndDt')['Amount'].transform(lambda x: x.nlargest(2).iloc[1])
df['NewAmt'] = df[['NewAmt1', 'NewAmt2']].sum(axis=1)
df
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...