2013-02-21 40 views
16

Tôi đang cố gắng bọc đầu xung quanh các phương pháp nhóm Pandas. Tôi muốn viết một hàm thực hiện một số hàm tổng hợp và sau đó trả về một khung dữ liệu Pandas. Dưới đây là một ví dụ đơn giản hóa tổng thể bằng cách sử dụng sum(). Tôi biết có nhiều cách dễ dàng hơn để làm tiền đơn giản, trong cuộc sống thực chức năng của tôi là phức tạp hơn:trả lại dữ liệu tổng hợp từ nhóm gấu trúc theo số

import pandas as pd 
df = pd.DataFrame({'col1': ['A', 'A', 'B', 'B'], 'col2':[1.0, 2, 3, 4]}) 

In [3]: df 
Out[3]: 
    col1 col2 
0 A  1 
1 A  2 
2 B  3 
3 B  4 

def func2(df): 
    dfout = pd.DataFrame({ 'col1' : df['col1'].unique() , 
          'someData': sum(df['col2']) }) 
    return dfout 

t = df.groupby('col1').apply(func2) 

In [6]: t 
Out[6]: 
     col1 someData 
col1     
A 0 A   3 
B 0 B   7 

tôi đã không mong đợi để có col1 trong đó hai lần tôi cũng không hy vọng rằng điều index bí ẩn tìm kiếm. Tôi thực sự nghĩ rằng tôi sẽ chỉ nhận được col1 & someData.

Trong ứng dụng thực tế, tôi đang nhóm theo nhiều cột và thực sự muốn lấy lại một DataFrame chứ không phải đối tượng Series.
Bất kỳ ý tưởng nào về giải pháp hoặc giải thích về những gì Pandas đang làm trong ví dụ trên của tôi?

----- Thông tin thêm -----

Lẽ ra tôi nên bắt đầu với ví dụ này, tôi nghĩ:

In [13]: import pandas as pd 

In [14]: df = pd.DataFrame({'col1':['A','A','A','B','B','B'], 'col2':['C','D','D','D','C','C'], 'col3':[.1,.2,.4,.6,.8,1]}) 

In [15]: df 
Out[15]: 
    col1 col2 col3 
0 A C 0.1 
1 A D 0.2 
2 A D 0.4 
3 B D 0.6 
4 B C 0.8 
5 B C 1.0 

In [16]: def func3(df): 
    ....:   dfout = sum(df['col3']**2) 
    ....:   return dfout 
    ....: 

In [17]: t = df.groupby(['col1', 'col2']).apply(func3) 

In [18]: t 
Out[18]: 
col1 col2 
A  C  0.01 
     D  0.20 
B  C  1.64 
     D  0.36 

Trong hình minh họa trên là kết quả của các apply() chức năng là một loạt Pandas. Và nó thiếu các cột nhóm từ df.groupby. Bản chất của những gì tôi đang đấu tranh là làm thế nào để tôi tạo ra một chức năng mà tôi áp dụng cho một groupby mà trả về cả kết quả của hàm AND các cột mà nó được nhóm lại?

----- chưa cập nhật khác ------

Dường như nếu tôi sau đó làm điều này:

pd.DataFrame(t).reset_index() 

tôi nhận lại một dataframe mà thực sự gần gũi với những gì tôi đã sau.

+1

btw, hướng dẫn này bằng một trong những lập trình viên gấu trúc đã giúp tôi hiểu được groupby và tập hợp cơ học của gấu trúc: https://www.youtube.com/watch?v=MxRMXhjXZos – Zelazny7

+0

Trong ví dụ này bạn đã nối , mục đích của groupby là gì (nó sẽ chỉ tìm thấy dupes), bạn có thể chỉ cần áp dụng cho chính df và thêm nó như là một cột: 'df ['func3'] = df.áp dụng (hàng lambda: hàng ['col2'] ** 2, trục = 1) '. ? –

+0

Dữ liệu hơi đơn giản cho ví dụ, tôi sợ. Tôi sẽ cập nhật ví dụ. –

Trả lời

6

Lý do bạn thấy các cột có 0 là do đầu ra của .unique() là một mảng .

Cách tốt nhất để hiểu làm thế nào áp dụng của bạn sẽ làm việc là để kiểm tra mỗi hành động nhóm-khôn ngoan:

In [11] :g = df.groupby('col1') 

In [12]: g.get_group('A') 
Out[12]: 
    col1 col2 
0 A  1 
1 A  2 

In [13]: g.get_group('A')['col1'].unique() 
Out[13]: array([A], dtype=object) 

In [14]: sum(g.get_group('A')['col2']) 
Out[14]: 3.0 

Phần lớn thời gian bạn muốn đây là một tổng hợp giá trị.

Đầu ra của grouped.apply sẽ luôn có nhãn nhóm làm chỉ mục (giá trị duy nhất của 'col1'), vì vậy, ví dụ về việc xây dựng ví dụ col1 có vẻ hơi khó hiểu đối với tôi.

Lưu ý: Để bật 'col1' (chỉ mục) trở lại cột bạn có thể gọi reset_index, vì vậy trong trường hợp này.

In [15]: g.sum().reset_index() 
Out[15]: 
    col1 col2 
0 A  3 
1 B  7 
+0

Cảm ơn bạn đã giải thích về mảng. Tôi rõ ràng đang mang hành lý R của mình tới Python. –

+0

cho một chức năng tùy ý mà tôi đang áp dụng, nhóm có vẻ như thả các cột nhóm của tôi khỏi kết quả và chỉ trả về một loạt các câu trả lời. Rõ ràng bằng cách sử dụng phương thức sum() nhận được xung quanh điều đó, nhưng nó không hữu ích cho các hàm tùy chỉnh không được thực hiện như các phương thức nhóm. Tôi đã thêm một ví dụ cho câu hỏi của mình để minh họa tốt hơn. –

+0

@ JDLong bạn có phải là nhóm trên mỗi cột không? (với tôi, điều này có vẻ lạ lùng, nhưng tôi đồng ý rằng đầu ra hơi lạ: không có MultiIndex của các cột): s –

Các vấn đề liên quan