Cách in một đối tượng theo nhóm


134

Tôi muốn in kết quả của nhóm với Gấu trúc.

Tôi có một khung dữ liệu:

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

Khi in sau khi nhóm theo 'A', tôi có như sau:

print(df.groupby('A'))

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

Làm cách nào để in khung dữ liệu được nhóm lại?

Nếu tôi làm:

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

Tôi nhận được khung dữ liệu như thể nó không được nhóm lại:

             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

Tôi đã mong đợi một cái gì đó như:

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

Tôi đang nhận được đầu ra chính xác với print df.groupby('A').head(). bạn có phiên bản gấu trúc nào?
Amit Verma

Tôi vừa cập nhật lên 0.13.1 trên cả máy tính để bàn và máy tính xách tay của mình.
user3465658

1
Làm thế nào về "list ()" đối tượng trực tiếp? Và sau đó bạn có thể thao tác / in nó như một cấu trúc dữ liệu bình thường.
Tropicpenguin

Theo như tôi có thể nói, không một câu trả lời nào có thể tạo ra sản lượng mong muốn. Đối với ví dụ cụ thể này, gần nhất tôi có thể tìm thấy là df.groupby(['A', 'B']).sum(), nhưng nó sẽ thất bại nếu ('A', 'B')các cặp không phải là duy nhất.
Eric Duminil

Câu trả lời:


100

Đơn giản chỉ cần làm:

grouped_df = df.groupby('A')

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

Điều này cũng hoạt động,

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

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

Đối với nhóm khóa có chọn lọc: Chèn các khóa bạn muốn vào bên trong key_list_from_gb, sau đây, sử dụng 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
Một lựa chọn khác là:for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
tommy.carstensen

__iter __ () cũng làm việc Nó trả Generator năng suất chuỗi (tên, đối tượng subsetted) cho mỗi nhóm.
Jeremy Z

Tại sao không lặp lại key_list_from_gbmặc dù?
pfnuesel 11/09/19

66

Nếu bạn chỉ đang tìm cách hiển thị nó, bạn có thể sử dụng description ():

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

Điều này mang lại cho bạn một chiếc bàn gọn gàng.


7
Đó là một chiếc bàn gọn gàng nhưng nó không phải là chiếc bàn mong muốn.
Eric Duminil,

15

Tôi đã xác nhận rằng hành vi head()thay đổi giữa phiên bản 0.12 và 0.13. Điều đó trông giống như một lỗi đối với tôi. Tôi đã tạo ra một vấn đề .

Nhưng hoạt động theo nhóm không thực sự trả về DataFrame được sắp xếp theo nhóm. Các .head()phương pháp là một chút sai lệch ở đây - nó chỉ là một chức năng thuận tiện để cho phép bạn kiểm tra lại các đối tượng (trong trường hợp này, df) mà bạn nhóm lại. Kết quả của groupbylà một loại đối tượng riêng biệt, một GroupByđối tượng. Bạn phải apply, transformhoặcfilter quay lại DataFrame hoặc Series.

Nếu tất cả những gì bạn muốn làm là sắp xếp theo các giá trị trong cột A, bạn nên sử dụng df.sort('A').


4
lưu ý rằng headthực sự đang hoạt động, head(5)nó đang hiển thị 5 hàng đầu tiên, đúng hơn với khung 'hiển thị' df.groupby('A').apply(lambda x: x), đó thực sự là một passthru. Tôi cho rằng bạn có thể có một pass()phương pháp, có thể.
Jeff

13

Một thay thế đơn giản khác:

for name_of_the_group, group in grouped_dataframe:
   print (name_of_the_group)
   print (group)

9

Ngoài ra, thay thế đơn giản khác có thể là:

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

7

Ngoài các câu trả lời trước:

Lấy ví dụ của bạn,

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

Sau đó, mã 1 dòng đơn giản

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

4

Cảm ơn Surya vì những hiểu biết tốt. Tôi muốn làm sạch giải pháp của anh ấy và chỉ cần làm:

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

3

Danh sách cuộc gọi () trên đối tượng GroupBy

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

mang đến cho bạn:

[('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)]

Vâng, điều này cần nhiều phiếu bầu hơn! Bạn cũng có thể làm điều này sau khi bạn nhóm đối tượng. df_g = df.groupby ('A') thì bạn có thể gọi danh sách (df_g) hoặc nếu bạn chỉ muốn danh sách gọi nhóm đầu tiên (df_g) [0]. Đây là một điều tôi thích về R hơn Python. Trong R, bạn không phải lặp qua hầu hết các đối tượng để xem dữ liệu, nhưng Python thì bạn phải lặp lại rất nhiều đối tượng. Tìm kiếm proceses như thế này là mới mẻ. Cảm ơn Elizabeth.
PVic

2

bạn không thể nhìn thấy nhómBằng dữ liệu trực tiếp bằng câu lệnh in nhưng bạn có thể xem bằng cách lặp lại nhóm bằng vòng lặp for, hãy thử mã này để xem nhóm theo dữ liệu

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)

bạn sẽ nhận được đầu ra sau khi thử điều này dưới dạng kết quả theo nhóm

Tôi hy vọng nó sẽ giúp


2

Trong Máy tính xách tay Jupyter, nếu bạn làm như sau, nó sẽ in một phiên bản được nhóm đẹp mắt của đối tượng. Các applyphương pháp giúp tạo ra một dataframe multiindex.

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

Đầu ra:

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

Nếu bạn muốn by(các) cột không xuất hiện trong đầu ra, chỉ cần thả (các) cột, như vậy.

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

Đầu ra:

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

Ở đây, tôi không chắc tại sao .iloc[:]không hoạt động thay vì [:]ở cuối. Vì vậy, nếu có một số vấn đề trong tương lai do cập nhật (hoặc hiện tại), .iloc[:len(a)]cũng hoạt động.


0

Tôi đã tìm ra một cách khó, chỉ để động não, hãy xem đoạn mã:

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)

đầu ra:

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

Ưu điểm là rất dễ in, vì nó trả về một khung dữ liệu, thay vì Đối tượng Nhóm. Và đầu ra có vẻ đẹp. Trong khi điều khó khăn là nó tạo ra một loạt dữ liệu dư thừa.


0

Trong 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

Theo cách tương tác hơn


-2

để in tất cả (hoặc nhiều) dòng của df được nhóm:

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

grouped_df = df.group(['var1', 'var2'])
print(grouped_df)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.