2013-08-01 25 views
18

Tôi đang sử dụng .size() trên kết quả nhóm để đếm số lượng mục trong mỗi nhóm.Làm cách nào để gán tên cho cột size()?

Tôi muốn kết quả được lưu vào tên cột mới mà không cần chỉnh sửa thủ công mảng tên cột, làm thế nào nó có thể được thực hiện?

Cảm ơn

Đây là những gì tôi đã cố gắng:

grpd = df.groupby(['A','B']) 
grpd['size'] = grpd.size() 
grpd 

và lỗi tôi nhận:

TypeError: 'DataFrameGroupBy' object does not support item assignment (on the second line)

+1

đáng chú ý rằng '' size'' là một lựa chọn không tốt cho một cột vì nó là phương thức dựng sẵn trên mọi đối tượng dưới gấu trúc, vì vậy bạn chỉ có thể truy xuất nó thông qua '' getitem'' và không thông qua '' getattr'' . – Meitham

Trả lời

12

Kết quả của df.groupby(...) không phải là một DataFrame. Để lấy lại DataFrame, bạn phải áp dụng một hàm cho mỗi nhóm, chuyển đổi từng phần tử của nhóm hoặc lọc nhóm.

Dường như bạn muốn có DataFrame chứa (1) tất cả dữ liệu gốc của bạn theo số df và (2) đếm số lượng dữ liệu trong mỗi nhóm. Những thứ này có độ dài khác nhau, vì vậy nếu chúng cần phải đi vào cùng một DataFrame, bạn sẽ cần phải liệt kê kích thước thừa, tức là, đối với mỗi hàng trong mỗi nhóm.

df['size'] = df.groupby(['A','B']).transform(np.size) 

(Ngoài: Nó rất hữu ích nếu bạn có thể hiển thị đầu vào mẫu ngắn gọn và kết quả mong đợi.)

+1

yay, biến đổi! –

+0

Tôi cũng thấy điều này gần như bằng nhau (tạo ra một khung dữ liệu mới), nhưng không chắc nó so sánh với giải pháp của bạn như thế nào về hiệu quả http://stackoverflow.com/questions/10373660/converting-a-pandas-groupby-object -to-dataframe – d1337

+0

Hơn giải pháp của bạn hoạt động tốt trên ví dụ đồ chơi, nhưng trên dữ liệu thực tế, lỗi được trả về http://pastebin.com/aCsMxCd5 – d1337

6

Bạn cần transformsize-len của df là giống như trước:

import pandas as pd 

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y'] 
       , 'B': ['a', 'c', 'c','b','b']}) 
print (df) 
    A B 
0 x a 
1 x c 
2 x c 
3 y b 
4 y b 

df['size'] = df.groupby(['A', 'B'])['A'].transform('size') 
print (df) 
    A B size 
0 x a  1 
1 x c  2 
2 x c  2 
3 y b  2 
4 y b  2 

Nếu cần đặt tên cột trong tổng hợp df - len của df rõ ràng là KHÔNG cùng một s trước:

import pandas as pd 

df = pd.DataFrame({'A': ['x', 'x', 'x','y','y'] 
       , 'B': ['a', 'c', 'c','b','b']}) 
print (df) 
    A B 
0 x a 
1 x c 
2 x c 
3 y b 
4 y b 

df = df.groupby(['A', 'B']).size().reset_index(name='Size') 
print (df) 
    A B Size 
0 x a  1 
1 x c  2 
2 y b  2 
12

Các .size() built-in phương pháp DataFrameGroupBy các đối tượng thực sự trả về một đối tượng Series với các kích thước nhóm và không phải là một DataFrame. Nếu bạn muốn một DataFrame có cột là kích thước nhóm, được nhóm theo chỉ mục, với tên tùy chỉnh, bạn có thể sử dụng phương thức .to_frame() và sử dụng tên cột mong muốn làm đối số của nó.

grpd = df.groupby(['A','B']).size().to_frame('size') 

Nếu bạn muốn nhóm trở thành cột lần nữa, bạn có thể thêm .reset_index() vào cuối.