Kembalikan string tertentu ke kolom berdasarkan dua tanggal yang dilewati menggunakan pernyataan if atau fungsi lambda

Saya ingin mengembalikan string tertentu dari dua kolom tanggal yang lewat. Kode saya sejauh ini:

df_Date = df[df['state'].str.contains('Traded Away') & df['maturity_date']!=0][['state','maturity_date']]
df_Date['maturity_date'] = pd.to_datetime(df_Date['maturity_date'])
df_Date['Today'] = pd.to_datetime('today') 
df_Date['Days'] = (df_Date['maturity_date'] - df_Date['Today'])
print(df_Date.head(10))


          state maturity_date      Today       Days
0   Traded Away    2018-03-15 2018-03-19    -4 days
10  Traded Away    2025-06-15 2018-03-19  2645 days
12  Traded Away    2047-03-21 2018-03-19 10594 days
15  Traded Away    2166-03-15 2018-03-19 54052 days
17  Traded Away    2166-12-18 2018-03-19 54330 days
20  Traded Away    2023-05-04 2018-03-19  1872 days
22  Traded Away    2027-11-15 2018-03-19  3528 days
23  Traded Away    2025-03-15 2018-03-19  2553 days
25  Traded Away    2023-01-15 2018-03-19  1763 days
26  Traded Away    2166-05-01 2018-03-19 54099 days

Fungsi saya untuk mengonversi hari menjadi string adalah sebagai berikut dan menghasilkan kesalahan: TypeError: perbandingan tipe tidak valid ketika saya mencetak kerangka data.

def Risk_Bucket(x): 
    if x  <= 730:
        return '< 2YR'
    elif  (x > 730 and x  <= 1825):
        return '2YR_5YR'
    elif  (x > 1825 and x  <= 2555):
        return '5YR_7YR'
    elif  (x > 2555 and x <= 3650):
        return '7YR_10YR'
    elif  (x > 3650 and x  <= 7300):
        return '10YR_20YR'
    elif  (x > 7300):
        return '> 20YR'
    else:
        return "Check passed Date"
df_Date['Bucket'] = Risk_Bucket(df_Date['Days'])

print(df_Date.head(10))

Saya berasumsi ini karena kolom Hari memiliki string 'hari' di dalamnya?

Bagaimana cara membuat kolom Hari menjadi numerik? Adakah saran untuk mengatasi ini dan meningkatkan kode saya?


person Peter Lucas    schedule 19.03.2018    source sumber
comment
Terkait: Python: Konversikan timedelta ke int dalam kerangka data   -  person jpp    schedule 19.03.2018


Jawaban (1)


Saya yakin Anda perlu mengonversi delta waktu atau hari paling lambat days :

df_Date['Bucket'] = df_Date['Days'].dt.days.apply(Risk_Bucket)

Kode yang ditingkatkan dengan cut:

bins = [-np.inf,730,1825,2555,3650,7300,np.inf]
labels = ['< 2YR', '2YR_5YR','5YR_7YR','7YR_10YR', '10YR_20YR', '> 20YR']
df_Date['Bucket'] = pd.cut(df_Date['Days'].dt.days, bins=bins, labels=labels)

Memeriksa:

bins = [-np.inf,730,1825,2555,3650,7300,np.inf]
labels = ['< 2YR', '2YR_5YR','5YR_7YR','7YR_10YR', '10YR_20YR', '> 20YR']
df_Date['Bucket'] = df_Date['Days'].dt.days.apply(Risk_Bucket)
df_Date['Bucket1'] = pd.cut(df_Date['Days'].dt.days, bins=bins, labels=labels)
print (df_Date)
          state maturity_date       Today       Days    Bucket   Bucket1
0   Traded Away    2018-03-15  2018-03-19    -4 days     < 2YR     < 2YR
10  Traded Away    2025-06-15  2018-03-19    72 days     < 2YR     < 2YR
12  Traded Away    2047-03-21  2018-03-19 10594 days    > 20YR    > 20YR
15  Traded Away    2166-03-15  2018-03-19 54052 days    > 20YR    > 20YR
17  Traded Away    2166-12-18  2018-03-19 54330 days    > 20YR    > 20YR
20  Traded Away    2023-05-04  2018-03-19  1872 days   5YR_7YR   5YR_7YR
22  Traded Away    2027-11-15  2018-03-19  3528 days  7YR_10YR  7YR_10YR
23  Traded Away    2025-03-15  2018-03-19  2553 days   5YR_7YR   5YR_7YR
25  Traded Away    2023-01-15  2018-03-19  1763 days   2YR_5YR   2YR_5YR
26  Traded Away    2166-05-01  2018-03-19 54099 days    > 20YR    > 20YR
person jezrael    schedule 19.03.2018
comment
Terima kasih Jezrael...sekali lagi; ) dt.days mengonversi nilai menjadi bilangan bulat? - person Peter Lucas; 19.03.2018
comment
@PeterLucas - Tepat sekali, tapi di sini cut lebih baik. - person jezrael; 19.03.2018
comment
Hai @jezrael Saya mendapatkan kesalahan SettingWithCopyWarning (Nilai mencoba disetel pada salinan potongan dari DataFrame). Setelah membaca banyak posting saya pikir df_Date = df_Date.copy() akan menghapus peringatan tersebut? - person Peter Lucas; 20.03.2018
comment
@PeterLucas - Bisakah Anda menunjukkan kode di mana Anda mendapat peringatan? Peringatan ini juga agak membingungkan, jadi perlu periksa juga kode di atas - 1,2 baris. Jelas ada beberapa pemfilteran, maka perlu copy, Anda benar. misalnya df1 = df[df['state'].isin(['Traded Away','another value'])].copy() - person jezrael; 20.03.2018
comment
Hmm, baris kedua seharusnya dfRFQ_Breakdown_By_State.loc[mask, 'rbc_security_type1'] = dfRFQ_Breakdown_By_State.loc[mask, 'instrument_group'].str.upper() - memfilter di kedua sisi. - person jezrael; 20.03.2018
comment
Saya menelusurinya kembali ke kerangka data awal saya: mask = dfRFQ_Breakdown_By_State['rbc_security_type1'] == 0 dfRFQ_Breakdown_By_State.loc[mask, 'rbc_security_type1'] = dfRFQ_Breakdown_By_State['instrument_group'].str.upper() Di sini saya memperbarui berbasis kolom pada kriteria dengan nilai di kolom lainnya. Pengelompokkan di atas kemudian digunakan pada kerangka data yang diperbarui ini. - person Peter Lucas; 20.03.2018
comment
Mari kita melanjutkan diskusi ini dalam chat. - person Peter Lucas; 20.03.2018