วิธีการพิมพ์วัตถุ groupby


134

ฉันต้องการพิมพ์ผลลัพธ์ของการจัดกลุ่มกับนุ่น

ฉันมีดาต้าเฟรม:

import pandas as pd
df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})
print(df)

       A  B
0    one  0
1    one  1
2    two  2
3  three  3
4  three  4
5    one  5

เมื่อพิมพ์หลังจากจัดกลุ่มตาม 'A' ฉันมีสิ่งต่อไปนี้:

print(df.groupby('A'))

<pandas.core.groupby.DataFrameGroupBy object at 0x05416E90>

ฉันจะพิมพ์ดาต้าเฟรมที่จัดกลุ่มได้อย่างไร

ถ้าฉันทำ:

print(df.groupby('A').head())

ฉันได้รับ dataframe ราวกับว่ามันไม่ได้ถูกจัดกลุ่ม:

             A  B
A                
one   0    one  0
      1    one  1
two   2    two  2
three 3  three  3
      4  three  4
one   5    one  5

ฉันคาดหวังสิ่งต่างๆเช่น:

             A  B
A                
one   0    one  0
      1    one  1
      5    one  5
two   2    two  2
three 3  three  3
      4  three  4

ฉันได้รับผลลัพธ์ที่ถูกต้องด้วยprint df.groupby('A').head(). คุณมีแพนด้ารุ่นอะไร?
Amit Verma

ฉันเพิ่งอัปเดตเป็น 0.13.1 ทั้งบนเดสก์ท็อปและแล็ปท็อป
user3465658

1
วิธีการ "list ()" วัตถุโดยตรง? จากนั้นคุณสามารถจัดการ / พิมพ์เป็นโครงสร้างข้อมูลปกติได้
Tropicpenguin

เท่าที่ฉันสามารถบอกได้ไม่มีคำตอบเดียวที่สามารถสร้างผลลัพธ์ที่ต้องการได้ สำหรับตัวอย่างเฉพาะนี้สิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้คือdf.groupby(['A', 'B']).sum()แต่จะล้มเหลวหาก('A', 'B')คู่ไม่ซ้ำกัน
Eric Duminil

คำตอบ:


100

เพียงแค่ทำ:

grouped_df = df.groupby('A')

for key, item in grouped_df:
    print(grouped_df.get_group(key), "\n\n")

นอกจากนี้ยังใช้งานได้

grouped_df = df.groupby('A')    
gb = grouped_df.groups

for key, values in gb.iteritems():
    print(df.ix[values], "\n\n")

สำหรับการจัดกลุ่มคีย์แบบเลือก:แทรกคีย์ที่คุณต้องการภายในkey_list_from_gbต่อไปนี้โดยใช้gb.keys(): ตัวอย่างเช่น

gb = grouped_df.groups
gb.keys()

key_list_from_gb = [key1, key2, key3]

for key, values in gb.items():
    if key in key_list_from_gb:
        print(df.ix[values], "\n")

1
อีกทางเลือกหนึ่งคือfor A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
tommy.carstensen

__iter __ () ก็ใช้งานได้มันส่งคืนลำดับการให้ผลผลิตของ Generator ของ (ชื่อวัตถุย่อย) สำหรับแต่ละกลุ่ม
Jeremy Z

ทำไมไม่วนซ้ำkey_list_from_gbล่ะ
pfnuesel

66

หากคุณกำลังมองหาวิธีแสดงคุณสามารถใช้คำอธิบาย ():

grp = df.groupby['colName']
grp.describe()

สิ่งนี้ทำให้คุณมีโต๊ะที่เรียบร้อย


7
เป็นโต๊ะที่เรียบร้อย แต่ไม่ใช่โต๊ะที่ต้องการ
Eric Duminil

15

ฉันยืนยันว่าพฤติกรรมของhead()การเปลี่ยนแปลงระหว่างเวอร์ชัน 0.12 และ 0.13 ดูเหมือนว่าจะเป็นข้อบกพร่องสำหรับฉัน ฉันสร้างปัญหา

แต่การดำเนินการ groupby ไม่ได้ส่งคืน DataFrame ที่จัดเรียงตามกลุ่ม .head()เป็นวิธีการที่ทำให้เข้าใจผิดเล็ก ๆ น้อย ๆ ที่นี่ - มันเป็นเพียงคุณสมบัติความสะดวกสบายที่จะช่วยให้คุณสามารถสอบใหม่วัตถุ (ในกรณีนี้df) ที่คุณจัดกลุ่ม ผลลัพธ์ของgroupbyเป็นวัตถุที่แยกจากกันคือGroupByวัตถุ คุณต้องapply, transformหรือfilterที่จะได้รับกลับไป DataFrame หรือซีรีส์

df.sort('A')หากสิ่งที่คุณต้องการจะทำคือเรียงลำดับตามค่าในคอลัมน์ที่คุณควรใช้


4
โปรดทราบว่าheadกำลังทำhead(5)iow มันกำลังแสดง 5 แถวแรกซึ่งถูกต้องมากขึ้นในการ 'show' frame คือdf.groupby('A').apply(lambda x: x)ซึ่งเป็น passthru อย่างมีประสิทธิภาพ ฉันคิดว่าคุณอาจมีpass()วิธีการ
Jeff


9

นอกจากนี้ทางเลือกง่ายๆอื่น ๆ อาจเป็น:

gb = df.groupby("A")
gb.count() # or,
gb.get_group(your_key)

7

นอกเหนือจากคำตอบก่อนหน้านี้:

ยกตัวอย่างของคุณ

df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})

จากนั้นรหัสง่ายๆ 1 บรรทัด

df.groupby('A').apply(print)

4

ขอบคุณ Surya สำหรับข้อมูลเชิงลึกที่ดี ฉันจะทำความสะอาดวิธีแก้ปัญหาของเขาและทำ:

for key, value in df.groupby('A'):
    print(key, value)

3

รายการโทร () บนวัตถุ GroupBy

print(list(df.groupby('A')))

ให้คุณ:

[('one',      A  B
0  one  0
1  one  1
5  one  5), ('three',        A  B
3  three  3
4  three  4), ('two',      A  B
2  two  2)]

ใช่แล้วต้องการคะแนนโหวตมากกว่านี้! คุณสามารถทำได้หลังจากจัดกลุ่มวัตถุแล้ว df_g = df.groupby ('A') จากนั้นคุณสามารถเรียกรายการ (df_g) หรือถ้าคุณต้องการเพียงแค่รายการโทรกลุ่มแรก (df_g) [0] นี่เป็นสิ่งหนึ่งที่ฉันชอบเกี่ยวกับ R มากกว่า Python ใน R คุณไม่จำเป็นต้องวนซ้ำผ่านวัตถุส่วนใหญ่เพื่อดูข้อมูล แต่ Python คุณต้องใช้กับวัตถุจำนวนมาก การค้นหากระบวนการเช่นนี้จะทำให้สดชื่น ขอบคุณ Elizabeth
PVic

2

คุณไม่สามารถดูข้อมูล groupBy ได้โดยตรงจากคำสั่งการพิมพ์ แต่คุณสามารถดูได้โดยการวนซ้ำผ่านกลุ่มโดยใช้สำหรับลูปลองใช้รหัสนี้เพื่อดูกลุ่มตามข้อมูล

group = df.groupby('A') #group variable contains groupby data
for A,A_df in group: # A is your column and A_df is group of one kind at a time
  print(A)
  print(A_df)

คุณจะได้รับผลลัพธ์หลังจากลองใช้เป็นผลลัพธ์แบบกลุ่ม

ฉันหวังว่ามันจะช่วยได้


2

ใน Jupyter Notebook หากคุณทำสิ่งต่อไปนี้เครื่องจะพิมพ์รุ่นที่มีการจัดกลุ่มของวัตถุที่ดี applyวิธีการช่วยในการสร้าง dataframe multiindex

by = 'A'  # groupby 'by' argument
df.groupby(by).apply(lambda a: a[:])

เอาท์พุท:

             A  B
A                
one   0    one  0
      1    one  1
      5    one  5
three 3  three  3
      4  three  4
two   2    two  2

หากคุณต้องการให้byคอลัมน์ไม่ปรากฏในผลลัพธ์ให้วางคอลัมน์ลงไปเช่นนั้น

df.groupby(by).apply(lambda a: a.drop(by, axis=1)[:])

เอาท์พุท:

         B
A         
one   0  0
      1  1
      5  5
three 3  3
      4  4
two   2  2

ตรงนี้ฉันไม่แน่ใจว่าทำไม.iloc[:]ไม่ทำงานแทน[:]ในตอนท้าย ดังนั้นหากมีปัญหาบางอย่างในอนาคตเนื่องจากการอัปเดต (หรือในปัจจุบัน) .iloc[:len(a)]ก็ใช้งานได้เช่นกัน


0

ฉันพบวิธีที่ยุ่งยากเพียงเพื่อระดมความคิดดูรหัส:

df['a'] = df['A']  # create a shadow column for MultiIndexing
df.sort_values('A', inplace=True)
df.set_index(["A","a"], inplace=True)
print(df)

ผลลัพธ์:

             B
A     a
one   one    0
      one    1
      one    5
three three  3
      three  4
two   two    2

ข้อดีคือพิมพ์ได้ง่ายมากเนื่องจากส่งคืน dataframe แทนที่จะเป็น Groupby Object และผลลัพธ์ก็ดูดี ในขณะที่ข้อเสียคือการสร้างชุดข้อมูลซ้ำซ้อน


0

ใน python 3

k = None
for name_of_the_group, group in dict(df_group):
    if(k != name_of_the_group):
        print ('\n', name_of_the_group)
        print('..........','\n')
    print (group)
    k = name_of_the_group

ในรูปแบบโต้ตอบมากขึ้น


0

df.groupby ('คีย์ที่คุณต้องการจัดกลุ่มตาม') ใช้ (พิมพ์)

ตามที่สมาชิกคนอื่นกล่าวถึงนี่เป็นวิธีที่ง่ายและง่ายที่สุดในการมองเห็นวัตถุ groupby


1
ยินดีต้อนรับ Karthik นี่คือคำตอบเดียวกับQPeiranหรือไม่?
RichieV

-2

เพื่อพิมพ์บรรทัดทั้งหมด (หรือโดยพลการ) ทั้งหมดของ df ที่จัดกลุ่ม:

import pandas as pd
pd.set_option('display.max_rows', 500)

grouped_df = df.group(['var1', 'var2'])
print(grouped_df)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.