ผลลัพธ์ของกลุ่มแพนด้าโดยใช้อาร์เรย์บูลีนที่แตกต่างกันเป็นคีย์
ฉันพยายามเข้าใจ groupby โดยใช้อาร์เรย์บูลีนเป็นคีย์นี่คือรหัสทดสอบ
a = pd.DataFrame([[True,False,False],[False,True,False]], columns=['A','B','C'])
print(a)
A B C
0 True False False
1 False True False
จากนั้นฉันลองชุดบูลีนอาร์เรย์ที่แตกต่างกันซึ่งดูเหมือนว่าผลลัพธ์ groupby จะเป็น r เดียวกันทั้งหมด
b=a.groupby([False,False])
b.apply(pd.DataFrame)
A B C
0 True False False
1 False True False
c=a.groupby([True,False])
c.apply(pd.DataFrame)
A B C
0 True False False
1 False True False
d=a.groupby([False,True])
d.apply(pd.DataFrame)
A B C
0 True False False
1 False True False
e=a.groupby([False,True])
e.apply(pd.DataFrame)
A B C
0 True False False
1 False True False
คำตอบ
มาทำลายมันลง
.groubpy().apply(pd.DataFrame)
ตามที่คุณใช้ในตัวแปรทั้งหมดจะใช้แถวจากแต่ละกลุ่มและสร้าง dataframe ซึ่งโดยพื้นฐานself
แล้วผลลัพธ์จะเหมือนกัน แต่วิธีที่แพนด้าได้รับนั้นแตกต่างกันในทุกกรณี
b=a.groupby([False,False])
: ทั้งสองแถวอยู่ในกลุ่มเดียวกัน (group_idFalse
) และแยกวิเคราะห์พร้อมกันหนึ่งครั้งเพื่อสร้าง df เดียวกันc=a.groupby([True,False])
: มีสองกลุ่มโดยแต่ละแถว Apply ใช้เวลาแต่ละกลุ่มและสร้าง DataFrames แยกกันสองเฟรม (หนึ่งต่อกลุ่ม) จากนั้นเชื่อมต่อและสร้าง df ให้เหมือนต้นฉบับd=a.groupby([False,True])
: เช่นเดียวกับ # 2False
แต่ตอนนี้แถวแรกอยู่ในกลุ่ม หากคุณรวมหรือใช้ฟังก์ชันอื่น (นอกเหนือจาก pandas.DataFrame) คุณจะเห็น df ที่มีTrue, False
ดัชนี (จัดเรียงกลุ่มตามค่าเริ่มต้น) และแถวที่ 1 จะปรากฏเป็นแถวแรกเนื่องจากเป็นของกลุ่มTrue
เนื่องจากพารามิเตอร์การจัดกลุ่มที่คุณส่งผ่านไม่สามารถแบ่งส่วนดาต้าเฟรมเป็นส่วนที่ต้องการได้ ดังนั้นเพียงแค่คัดลอก dataframe ทั้งหมดและ 'zip' ไปยังอาร์เรย์การจัดกลุ่มที่คุณกำลังส่งผ่าน ตัวอย่าง -
a = pd.DataFrame([[True,False,False],[False,True,False]], columns=['A','B','C'])
c = a.groupby([True,False])
print('length of grouper object:',len(c))
print(' ')
print(list(c)[0])
print(' ')
print(list(c)[1])
length of grouper object: 2
(False, A B C
1 False True False)
(True, A B C
0 True False False)
สังเกตว่าด้วยการจัดกลุ่มอาร์เรย์ [False, True] มันเป็นเพียงการบีบอัด dataframe ทั้งหมดด้วยแต่ละอัน หากคุณส่งผ่านสิ่งที่พบในแกน 1 แทนก็จะพิจารณารายการในชุดข้อมูลนั้นเพื่อจัดกลุ่มชุดข้อมูล
อีกวิธีหนึ่งในการตรวจสอบคือพารามิเตอร์การจัดกลุ่มต้องเป็นชุดข้อมูลที่มีชื่อและชื่อนี้ควรอยู่ในคอลัมน์ของกรอบข้อมูล หากคุณส่งอาร์เรย์ [True, False] โดยพื้นฐานแล้วจะถูกตีความว่าเป็นอนุกรมนิรนามดังนั้นจึงไม่สามารถรับคีย์เพื่อทำการแยกได้
ภาพที่ดีที่จะติดตามมีดังต่อไปนี้หากคุณต้องการทำความเข้าใจว่ากรุ๊ปบีทำงานอย่างไร -

การแบ่งจะเกิดขึ้นกับคีย์ที่ให้มาและคีย์จะต้องอ้างอิงได้ในดัชนี / คอลัมน์มิฉะนั้นจะไม่สามารถแยกและส่งคืน dataframe ที่ไม่ได้แยกกับแต่ละกลุ่ม ขั้นตอนแรกนี้คือสิ่งที่ปลากะรังทำขั้นตอนต่อไปคือการใช้และรวมขั้นตอนที่ตรงไปตรงมา ใน tuples ที่คุณเห็นด้านบน (ผลลัพธ์ที่พิมพ์ออกมา) ฟังก์ชัน Apply จะทำงานกับt[1]
องค์ประกอบของแต่ละทูเปิลหลังจากนั้นจะรวมเข้ากับt[0]
องค์ประกอบของแต่ละทูเพิลและเชื่อมต่อกันในแนวตั้ง