[FIXED] Anzahl der Gesamtzahl der Zeilen, die eine bestimmte Bedingung zwischen zwei verschiedenen Daten eines anderen DataFrame erfüllen

Ausgabe

Seien Sie der folgende Python-Pandas-DataFrame:

| num_ID | start_date  | end_date   | time              |
| ------ | ----------- | ---------- | ----------------- |
| 1      | 2022-02-14  | 2022-02-15 | 0 days 09:23:00   |
| 2      | 2022-02-12  | 2022-02-15 | 2 days 10:23:00   |
| 2      | 2022-02-05  | 2022-02-27 | 22 days 02:35:00  |
| 3      | 2022-02-04  | 2022-02-06 | 1 days 19:55:00   |

Und der folgende DataFrame, der aufeinanderfolgende Daten mit ihren jeweiligen Feiertagswerten in der is_holidaySpalte enthält.

| date       | is_holiday | name | other |
| ---------- | ---------- | ---- | ----- |
| 2022-01-01 | True       | ABC  | red   |
| 2022-01-02 | False      | CNA  | blue  |
...
# we assume in this case that the omitted rows have the value False in column 
| 2022-02-15 | True       | OOO  | red   |
| 2022-02-16 | True       | POO  | red   |
| 2022-02-17 | False      | KTY  | blue  |
...
| 2023-12-30 | False      | TTE  | white |
| 2023-12-31 | True       | VVV  | red   |

Ich möchte total_daysdem anfänglichen DataFrame eine neue Spalte hinzufügen, die die gesamten Feiertage angibt, die im zweiten DataFrame mit True gekennzeichnet sind, die jede Zeile zwischen den beiden Daten ( start_dateund end_date) durchläuft.

Beispiel für Ausgabeergebnis:

| num_ID | start_date  | end_date   | time              | total_days     |
| ------ | ----------- | ---------- | ----------------- | -------------- |
| 1      | 2022-02-14  | 2022-02-15 | 0 days 09:23:00   | 1              |
| 2      | 2022-02-12  | 2022-02-15 | 2 days 10:23:00   | 1              |
| 2      | 2022-02-05  | 2022-02-27 | 22 days 02:35:00  | 2              |
| 3      | 2022-02-04  | 2022-02-06 | 1 days 19:55:00   | 0              |

Lösung

Verwendung DataFrame.mergemit Querverknüpfung nach Zeilen mit nur Trues Filtern nach Spalte holiday, Filtern nach Series.betweenund Zählen nach GroupBy.size, zuletzt neue Spalte hinzufügen mit DataFrame.join:

df2 = df.merge(df1.loc[df1['holiday'], ['date']], how='cross')
s = (df2[df2['date'].between(df2["start_date"],df2["end_date"])]
       .groupby(['start_date','end_date']).size())

df = df.join(s.rename('total_holidays'), on=['start_date','end_date'])
df['total_holidays'] = df['total_holidays'].fillna(0, downcast='int')
print (df)
   num_ID start_date   end_date        total_time  total_holidays
0       1 2022-02-14 2022-02-15   0 days 09:23:00               1
1       2 2022-02-12 2022-02-15   2 days 10:23:00               1
2       2 2022-02-05 2022-02-27  22 days 02:35:00               2
3       3 2022-02-04 2022-02-06   1 days 19:55:00               0


Beantwortet von –
jezrael


Antwort geprüft von –
Mildred Charles (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like