2014-10-19 25 views
17

Tôi thường xuyên sử dụng chức năng agg() của gấu trúc được sử dụng để chạy thống kê tóm tắt trên mỗi cột của một data.frame. Ví dụ: dưới đây là cách bạn tạo ra độ lệch trung bình và tiêu chuẩn:Python Pandas: Là thứ tự được bảo quản khi sử dụng groupby() và agg()?

df = pd.DataFrame({'A': ['group1', 'group1', 'group2', 'group2', 'group3', 'group3'], 
        'B': [10, 12, 10, 25, 10, 12], 
        'C': [100, 102, 100, 250, 100, 102]}) 

>>> df 
[output] 
     A B C 
0 group1 10 100 
1 group1 12 102 
2 group2 10 100 
3 group2 25 250 
4 group3 10 100 
5 group3 12 102 

Trong cả hai trường hợp đó, thứ tự các hàng riêng lẻ được gửi đến chức năng tăng không quan trọng. Nhưng hãy xem xét ví dụ sau, trong đó:

df.groupby('A').agg([np.mean, lambda x: x.iloc[1] ]) 

[output] 

     mean <lambda> mean <lambda> 
A          
group1 11.0  12 101  102 
group2 17.5  25 175  250 
group3 11.0  12 101  102 

Trong trường hợp này hàm lambda như dự định, xuất hàng thứ hai trong mỗi nhóm. Tuy nhiên, tôi đã không thể tìm thấy bất cứ điều gì trong tài liệu gấu trúc ngụ ý rằng điều này được đảm bảo là đúng trong mọi trường hợp. Tôi muốn sử dụng agg() cùng với chức năng trung bình có trọng số, vì vậy tôi muốn chắc chắn rằng các hàng đi vào chức năng sẽ theo thứ tự giống như chúng xuất hiện trong khung dữ liệu gốc.

Có ai biết, lý tưởng thông qua một nơi nào đó trong tài liệu hoặc mã nguồn của gấu trúc, nếu điều này được đảm bảo đúng không?

+1

Vâng, tôi không thể nhìn thấy bất kỳ đảm bảo rằng trật tự được bảo quản trong các tài liệu, vì vậy nó không có vẻ một chút khôn ngoan khi dựa vào nó. Nếu thứ tự được phản ánh bởi cột 'B' của bạn thì bạn có thể sắp xếp từng nhóm bằng' B' trong lambda để chắc chắn. – Marius

+0

Thật không may là tôi muốn giữ các hàng được sắp xếp theo một cột không có trong tập hợp. Khung dữ liệu được sắp xếp trước cuộc gọi 'agg()', do đó, nó chỉ là một vấn đề nếu nó sắp xếp lại nó như một phần của 'groupby()'. – BringMyCakeBack

Trả lời

13

Xem nâng cao này issue

Câu trả lời ngắn gọn là có, groupby sẽ giữ gìn orderings như được thông qua năm Bạn có thể chứng minh điều này bằng cách sử dụng ví dụ của bạn như thế này:.

In [20]: df.sort_index(ascending=False).groupby('A').agg([np.mean, lambda x: x.iloc[1] ]) 
Out[20]: 
      B    C   
     mean <lambda> mean <lambda> 
A         
group1 11.0  10 101  100 
group2 17.5  10 175  100 
group3 11.0  10 101  100 

Điều này là không đúng cho resample tuy nhiên vì nó đòi hỏi một chỉ số đơn điệu (nó S work làm việc với một chỉ số không đơn điệu, nhưng sẽ sắp xếp nó trước).

của họ là một lá cờ sort= để groupby, nhưng điều này liên quan đến việc phân loại các nhóm với nhau và không phải là những quan sát trong một nhóm.

FYI: df.groupby('A').nth(1) là một cách an toàn để có được giá trị thứ 2 của một nhóm (như phương pháp của bạn ở trên sẽ thất bại nếu một nhóm có < 2 yếu tố)

+0

Cảm ơn bạn đã làm rõ và liên kết vấn đề! Ban đầu tôi đã sử dụng 'iloc' làm ví dụ vì tôi không thể biết cách chuyển qua' nnth() 'thành lệnh' agg() '(vì tại thời điểm đó' x' là một chuỗi). Có cách nào để gọi 'nnth()' ngoài chức năng thành viên của DataFrame không? – BringMyCakeBack

+0

'' nnth'' chỉ được xác định trên một nhóm. Ý bạn là gì 'ngoài chức năng thành viên của DataFrame'? – Jeff

+0

Tôi có nghĩa là tôi không thể tìm ra cách vượt qua 'nnth()' như một trong những hàm được gửi trong danh sách thành 'agg()'. Bạn không thể thực hiện '.agg ([np.mean, nnth])', hoặc 'DataFrame.nth()' hoặc 'lambda x: x.nth (2)'.Đó là những gì đã dẫn tôi đến iloc, mặc dù nó sẽ ném lỗi chỉ mục. Cách tốt nhất có lẽ là không cố gắng làm tất cả trong một bước; đầu tiên sử dụng 'nth()' sau đó sử dụng 'agg()', sau đó hợp nhất chúng. – BringMyCakeBack

0

Thậm chí dễ dàng hơn:

import pandas as pd 
    pd.pivot_table(df,index='A',aggfunc=(np.mean)) 

đầu ra:

  B C 
    A     
    group1 11.0 101 
    group2 17.5 175 
    group3 11.0 101 
Các vấn đề liên quan