ส่งกลับสตริงที่ระบุไปยังคอลัมน์ตามวันที่ที่ผ่านไปสองวันโดยใช้คำสั่ง if หรือฟังก์ชัน lambda

ฉันต้องการส่งคืนสตริงเฉพาะจากคอลัมน์วันที่ที่ผ่านไปสองคอลัมน์ รหัสของฉันจนถึงตอนนี้:

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

ฟังก์ชั่นของฉันในการแปลงวันเป็นสตริงมีดังนี้และให้ข้อผิดพลาด: TypeError: การเปรียบเทียบประเภทที่ไม่ถูกต้องเมื่อฉันพิมพ์ดาต้าเฟรม

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))

ฉันคิดว่าเป็นเพราะคอลัมน์ Days มีสตริง 'วัน' อยู่ในนั้น

ฉันจะทำให้คอลัมน์วันเป็นตัวเลขได้อย่างไร ข้อเสนอแนะใด ๆ เพื่อแก้ไขปัญหานี้และปรับปรุงโค้ดของฉัน


person Peter Lucas    schedule 19.03.2018    source แหล่งที่มา
comment
ที่เกี่ยวข้อง: Python: แปลง timedelta เป็น int ใน dataframe   -  person jpp    schedule 19.03.2018


คำตอบ (1)


ฉันเชื่อว่าคุณต้องแปลง timedeltas ot วันโดย days :

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

โค้ดที่ได้รับการปรับปรุงด้วย 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)

ตรวจสอบ:

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
ขอบคุณ Jezrael...อีกครั้ง; ) dt.days แปลงค่าเป็นจำนวนเต็มหรือไม่ - person Peter Lucas; 19.03.2018
comment
@PeterLucas - แน่นอน แต่ที่นี่ cut ดีกว่า - person jezrael; 19.03.2018
comment
สวัสดี @jezrael ฉันได้รับข้อผิดพลาด SettingWithCopyWarning (ค่ากำลังพยายามตั้งค่าบนสำเนาของสไลซ์จาก DataFrame) หลังจากอ่านโพสต์มากมาย ฉันคิดว่า df_Date = df_Date.copy() จะลบคำเตือนออกหรือไม่ - person Peter Lucas; 20.03.2018
comment
@PeterLucas - คุณสามารถแสดงรหัสที่คุณได้รับคำเตือนได้หรือไม่? คำเตือนนี้ยังสับสนเล็กน้อย ดังนั้นต้องตรวจสอบโค้ดด้านบนด้วย - 1,2 บรรทัด แน่นอนว่ามีการกรองอยู่บ้าง ดังนั้นจำเป็นต้องมี copy คุณพูดถูก เช่น. df1 = df[df['state'].isin(['Traded Away','another value'])].copy() - person jezrael; 20.03.2018
comment
อืม บรรทัดที่สองควรเป็น dfRFQ_Breakdown_By_State.loc[mask, 'rbc_security_type1'] = dfRFQ_Breakdown_By_State.loc[mask, 'instrument_group'].str.upper() - กรองทั้งสองด้าน - person jezrael; 20.03.2018
comment
ฉันติดตามมันกลับไปที่ dataframe เริ่มต้นของฉัน: 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() ที่นี่ฉันกำลังอัปเดตคอลัมน์ตาม ตามเกณฑ์ที่มีค่าในอีกคอลัมน์หนึ่ง การฝากข้อมูลด้านบนจะถูกนำมาใช้กับดาต้าเฟรมที่อัปเดตนี้ - person Peter Lucas; 20.03.2018
comment
ให้เราสนทนาต่อในการแชท - person Peter Lucas; 20.03.2018