ผลลัพธ์ของกลุ่มแพนด้าโดยใช้อาร์เรย์บูลีนที่แตกต่างกันเป็นคีย์

Aug 19 2020

ฉันพยายามเข้าใจ 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

คำตอบ

RichieV Aug 20 2020 at 04:23

มาทำลายมันลง

.groubpy().apply(pd.DataFrame)ตามที่คุณใช้ในตัวแปรทั้งหมดจะใช้แถวจากแต่ละกลุ่มและสร้าง dataframe ซึ่งโดยพื้นฐานselfแล้วผลลัพธ์จะเหมือนกัน แต่วิธีที่แพนด้าได้รับนั้นแตกต่างกันในทุกกรณี

  1. b=a.groupby([False,False]): ทั้งสองแถวอยู่ในกลุ่มเดียวกัน (group_id False) และแยกวิเคราะห์พร้อมกันหนึ่งครั้งเพื่อสร้าง df เดียวกัน

  2. c=a.groupby([True,False]): มีสองกลุ่มโดยแต่ละแถว Apply ใช้เวลาแต่ละกลุ่มและสร้าง DataFrames แยกกันสองเฟรม (หนึ่งต่อกลุ่ม) จากนั้นเชื่อมต่อและสร้าง df ให้เหมือนต้นฉบับ

  3. d=a.groupby([False,True]): เช่นเดียวกับ # 2 Falseแต่ตอนนี้แถวแรกอยู่ในกลุ่ม หากคุณรวมหรือใช้ฟังก์ชันอื่น (นอกเหนือจาก pandas.DataFrame) คุณจะเห็น df ที่มีTrue, Falseดัชนี (จัดเรียงกลุ่มตามค่าเริ่มต้น) และแถวที่ 1 จะปรากฏเป็นแถวแรกเนื่องจากเป็นของกลุ่มTrue

1 AkshaySehgal Aug 20 2020 at 04:14

เนื่องจากพารามิเตอร์การจัดกลุ่มที่คุณส่งผ่านไม่สามารถแบ่งส่วนดาต้าเฟรมเป็นส่วนที่ต้องการได้ ดังนั้นเพียงแค่คัดลอก 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]องค์ประกอบของแต่ละทูเพิลและเชื่อมต่อกันในแนวตั้ง