Ausgabe
Seien Sie der folgende Python-Pandas-DataFrame:
| num_ID | start_date | end_date | other_column |
| ------ | ----------- | ---------- | ----------------- |
| 1 | 2022-02-14 | 2022-02-15 | 09:23:00 |
| 1 | 2022-02-20 | 2022-02-25 | 12:10:01 |
| 2 | 2022-03-11 | 2022-03-21 | 08:21:00 |
| 2 | 2022-03-22 | 2022-03-27 | 02:36:00 |
| 2 | 2022-04-10 | 2022-04-15 | 11:43:03 |
| 3 | 2022-02-04 | 2022-02-06 | 16:51:00 |
| 3 | 2022-02-14 | 2022-02-23 | 19:35:10 |
| 4 | 2022-02-28 | 2022-10-12 | 00:01:00 |
Für jeden num_ID
Wert möchte ich eine neue Spalte total_times
mit dem Wert 1 hinzufügen, wenn der end_date
Wert der vorherigen Zeile und der start_date
Wert der aktuellen Zeile mindestens 7 Tage auseinander liegen.
Fügen Sie zuerst den Wert 0 für diese Spalte für die erste Zeile jedes num_ID
Werts hinzu, da sie keine vorherige Zeile haben.
| num_ID | start_date | end_date | other_column | total_times |
| ------ | ----------- | ---------- | ----------------- | ----------- |
| 1 | 2022-02-14 | 2022-02-15 | 09:23:00 | 0 |
| 1 | 2022-02-20 | 2022-02-25 | 12:10:01 | |
| 2 | 2022-03-11 | 2022-03-21 | 08:21:00 | 0 |
| 2 | 2022-03-22 | 2022-03-27 | 02:36:00 | |
| 2 | 2022-04-10 | 2022-04-15 | 11:43:03 | |
| 3 | 2022-02-04 | 2022-02-06 | 16:51:00 | 0 |
| 3 | 2022-02-14 | 2022-02-23 | 19:35:10 | |
| 4 | 2022-02-28 | 2022-10-12 | 00:01:00 | 0 |
Schließlich füllen wir die restlichen Zeilen mit der Bedingung, ob der end_date
Wert der vorherigen Zeile (mit demselben num_ID
) mindestens 7 Tage vom aktuellen entfernt ist start_date
.
| num_ID | start_date | end_date | other_column | total_times |
| ------ | ----------- | ---------- | ----------------- | ----------- |
| 1 | 2022-02-14 | 2022-02-15 | 09:23:00 | 0 |
| 1 | 2022-02-20 | 2022-02-25 | 12:10:01 | 0 |
| 2 | 2022-03-11 | 2022-03-21 | 08:21:00 | 0 |
| 2 | 2022-03-22 | 2022-03-27 | 02:36:00 | 0 |
| 2 | 2022-04-10 | 2022-04-15 | 11:43:03 | 1 |
| 3 | 2022-02-04 | 2022-02-06 | 16:51:00 | 0 |
| 3 | 2022-02-14 | 2022-02-23 | 19:35:10 | 1 |
| 4 | 2022-02-28 | 2022-10-12 | 00:01:00 | 0 |
Lösung
Sie können einen pro Gruppe verschobenen Vergleich mit verwenden groupby.shift
und ihn mit ge
(≥) mit Ihrem Schwellenwert vergleichen und die boolesche Reihe in eine Ganzzahl umwandeln:
df['total_times'] = (df['start_date'].sub(df.groupby('num_ID')['end_date'].shift())
.ge('7d').astype(int)
)
Ausgang:
num_ID start_date end_date other_column total_times
0 1 2022-02-14 2022-02-15 09:23:00 0
1 1 2022-02-20 2022-02-25 12:10:01 0
2 2 2022-03-11 2022-03-21 08:21:00 0
3 2 2022-03-22 2022-03-27 02:36:00 0
4 2 2022-04-10 2022-04-15 11:43:03 1
5 3 2022-02-04 2022-02-06 16:51:00 0
6 3 2022-02-14 2022-02-23 19:35:10 1
7 4 2022-02-28 2022-10-12 00:01:00 0
Beantwortet von – mozway
Antwort geprüft von – Timothy Miller (FixError Admin)