การดำเนินการบน dataframe ของ pandas ระหว่างค่าของคอลัมน์/แถวที่ระบุ

ใหม่สำหรับแพนด้า ฉันพยายามจัดการการดำเนินการ dataframe บางอย่างกับ pandas โดยที่ฉันมี 4 คอลัมน์บน dataframe แบบหลายดัชนี และที่ที่ฉันต้องการคอลัมน์พิเศษโดยที่ค่าในคอลัมน์นั้นจะเท่ากับค่าในหนึ่งแถวหารด้วย แถวเฉพาะ

ในตัวอย่างของฉันด้านล่าง ฉันต้องการให้แต่ละรายการมีคอลัมน์ใหม่ "Agg" เป็นผลลัพธ์ของคอลัมน์ "ค่า" สำหรับแต่ละประเภท (1, 2, 3) หารด้วย "ค่า" สำหรับการคำนวณ

        Date        Values  Agg
2016-01-01  Type 1    17     1.7
            Type 2    23     2.3
            Type 3    11     1.1
            Calc      10     1.0
2016-01-02  Type 1    25     0.25
            Type 2    39     0.39
            Type 3    34     0.34
            Calc      100    1.00
2016-01-03  Type 1    20     1.00
            Type 2    9      0.45
            Type 2    12     0.60
            Calc      20     1.00

ในโค้ดจริงของฉันฉันมี groupby "Date" และดัชนีอื่น ๆ : การเปลี่ยนแปลงเหล่านี้ขึ้นอยู่กับผลลัพธ์จากการสืบค้นไปยัง db

ขอบคุณล่วงหน้า !


person John_Mtl    schedule 11.04.2016    source แหล่งที่มา
comment
ขออภัย คุณตามหลัง df['Agg'] = df['Values'].div(df['Values'].iloc[-1]) ใช่ไหม   -  person EdChum    schedule 11.04.2016
comment
สวัสดีเอ็ด ขอบคุณสำหรับคำตอบของคุณ ในโค้ดของฉันฉันมีวันที่หลายวันและค่าแถว Calc สำหรับแต่ละวัน ฉันต้องหาวิธีพูดถึงว่าฉันต้องการค่าเฉพาะของการหารสำหรับวันที่ที่ระบุในดัชนี   -  person John_Mtl    schedule 11.04.2016
comment
คุณช่วยตอบคำถามของคุณเพื่ออธิบายให้ดีขึ้นได้ไหม   -  person EdChum    schedule 11.04.2016
comment
ฉันแก้ไขรหัสในโพสต์เริ่มต้น ดาต้าเฟรมมีขนาดใหญ่และมีวันที่มากมาย สิ่งที่ฉันต้องการบรรลุคือการสามารถคำนวณ Type n / Calc สำหรับฟิลด์ค่าและสำหรับแต่ละวันที่ได้เสมอ ไม่ว่าดาต้าเฟรมจะมีขนาดเท่าใดก็ตาม ขอบคุณสำหรับความช่วยเหลือของคุณ!   -  person John_Mtl    schedule 11.04.2016


คำตอบ (1)


รหัสด้านล่างใช้งานได้ ฉันใช้เวลาเขียนมันมากเกินไป ดังนั้นฉันจึงต้องทิ้งมันไว้อย่างนั้น แจ้งให้เราทราบหากคุณต้องการคำอธิบาย!

def func(df1):
    idx = df1.index.get_level_values(0)[0]
    df1 = df1.loc[idx]
    return (df1['Values'] / df1.loc['Calc']['Values']).to_frame()

df.groupby(level=0).apply(func)
person IanS    schedule 11.04.2016
comment
มันทำงานได้อย่างสมบูรณ์แบบในบางกรณี แต่ฉันลงเอยด้วยการแยกค่าและเพิ่ม extra_column สำหรับโค้ดของฉัน ดังนั้นฉันจึงหลีกเลี่ยงข้อผิดพลาดในการถกเถียงข้อมูล ขอบคุณ! - person John_Mtl; 13.04.2016