Saya memiliki bingkai data yang terlihat agak seperti ini. Ada 100.000 baris di mana setiap baris memiliki nama seseorang dan tanggal awal dan akhir dari perjalanan yang mereka ambil.

Perjalanan para pelancong yang berbeda mungkin tumpang tindih.

enter image description here

Apa yang ingin saya lakukan adalah membuat bingkai data yang menyimpan riwayat perjalanan mereka sebagai seri waktu di mana jika mereka tinggal di rumah pada tanggal, nilainya nol dan jika mereka bepergian pada tanggal nilainya 1. Jadi sesuatu seperti ini:

enter image description here

Inilah yang telah saya lakukan sejauh ini dan tampaknya berhasil. Saya merasa bahwa apa yang saya lakukan mungkin tidak efisien dan mungkin bukan praktik terbaik karena saya mengisi bingkai data di dalam lingkaran. Saya akan menghargai bantuan apa pun dalam membuat kode saya lebih baik dan saya mempelajari hal-hal baru dalam prosesnya. Mwe di bawah ini. Terima kasih.

Pertama, saya membuat data mentah.

import datetime
import pandas as pd
import numpy as np

my_dict = {'Name': ["A", "A", "A", "B", "B"], 'Start Date': ['1/1/2019', '4/5/2019', '7/7/2019', '1/1/2019', '12/1/2019'], 'End Date': ['1/6/2019', '4/20/2019', '7/9/2019', '1/17/2019', '12/10/2019']}
df_raw = pd.DataFrame.from_dict(my_dict)
df_raw['Start Date'] = pd.to_datetime(df_raw['Start Date'], infer_datetime_format=True) 
df_raw['End Date'] = pd.to_datetime(df_raw['End Date'], infer_datetime_format=True) 

Kemudian saya membuat dataFrame yang diisi dengan nol dengan indeks dan nama kolom yang sesuai

date_range2 = pd.date_range(start=df_raw['Start Date'].min(), end=df_raw['End Date'].max())
columns2 = df_raw['Name'].unique()

df_panel2 = pd.DataFrame(index=date_range2, columns=columns2)
df_panel2 = df_panel2.fillna(0)

Maka saya loop melalui data asli saya dan mengisi bingkai data baru di mana pun dibutuhkan

for index, row in df_raw.iterrows():
    for date in pd.date_range(start=row['Start Date'], end=row['End Date']):
        df_panel2.loc[date.strftime('%m/%d/%Y'),row['Name']] = 1
1
Amatya 3 April 2021, 22:27

1 menjawab

Jawaban Terbaik

Anda dapat mencoba dengan pd.IntervalIndex. bersama dengan pd.get_dummies setelah membuat date_range2}

idx = pd.IntervalIndex.from_arrays(df_raw['Start Date'],
                                   df_raw['End Date'],closed='both')

out = pd.get_dummies(df_raw.set_index(idx)['Name'].reindex(date_range2))

print(out.head(15))

            A  B
2019-01-01  1  0
2019-01-02  1  0
2019-01-03  1  0
2019-01-04  1  0
2019-01-05  1  0
2019-01-06  1  0
2019-01-07  0  0
2019-01-08  0  1
2019-01-09  0  1
2019-01-10  0  1
2019-01-11  0  0
2019-01-12  0  0
2019-01-13  0  0
2019-01-14  0  0
2019-01-15  0  0
2
anky 3 April 2021, 19:42