2016-10-21 54 views
7

Cho một khung dữ liệu mà trông như thế nàyPandas: Sự khác nhau giữa giá trị lớn nhất và nhỏ nhất trong nhóm

GROUP VALUE 
    1  5 
    2  2 
    1  10 
    2  20 
    1  7 

Tôi muốn tính toán độ lệch giữa giá trị lớn nhất và nhỏ nhất trong mỗi nhóm. Tức là, kết quả phải là

GROUP DIFF 
    1  5 
    2  18 

Cách dễ dàng để thực hiện điều này trong Pandas là gì?

Cách nhanh nhất để thực hiện điều này trong Pandas cho một khung dữ liệu với khoảng 2 triệu hàng và 1 triệu nhóm là gì?

Trả lời

4

Bạn có thể sử dụng groupby(), min(), và max():

df.groupby('GROUP')['VALUE'].apply(lambda g: g.max() - g.min()) 
12

groupby/agg thường thực hiện tốt nhất khi bạn tận dụng lợi thế của các tập hợp built-in như 'max''min'. Vì vậy, để có được sự khác biệt, lần đầu tiên tính toán maxmin và sau đó trừ:

import pandas as pd 
df = pd.DataFrame({'GROUP': [1, 2, 1, 2, 1], 'VALUE': [5, 2, 10, 20, 7]}) 
result = df.groupby('GROUP')['VALUE'].agg(['max','min']) 
result['diff'] = result['max']-result['min'] 
print(result[['diff']]) 

mang

 diff 
GROUP  
1   5 
2  18 
+0

Thành thực mà nói, tôi ngạc nhiên như thế nào tốt hơn đây là hơn 'agg (np.ptp)' đặc biệt là trên một số lượng lớn các nhóm! – piRSquared

+0

Điều gì sẽ xảy ra nếu tôi muốn thực hiện việc này cho từng cột, không chỉ một ('VALUE')? – CPBL

+0

@CPBL: Nếu bạn muốn tìm 'min' và' max' cho tất cả các cột của 'df' (trên' GROUP'), thì chỉ cần xóa '['VALUE']'. Tức là, sử dụng 'df.groupby ('GROUP'). Agg (['max', 'min'])'. Nếu bạn muốn tìm 'min',' max' trên 'GROUP' cho một số chứ không phải tất cả các cột, hãy hạn chế' df' trước: 'df [['GROUP', 'VALUE1', 'VALUE2']]. 'GROUP'). Agg (['max', 'min']) '. – unutbu

9

Sử dụng @unutbu 's df

mỗi thời gian
unutbu của giải pháp tốt nhất trên các bộ dữ liệu lớn

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'GROUP': [1, 2, 1, 2, 1], 'VALUE': [5, 2, 10, 20, 7]}) 

df.groupby('GROUP')['VALUE'].agg(np.ptp) 

GROUP 
1  5 
2 18 
Name: VALUE, dtype: int64 

np.ptp docs lợi nhuận phạm vi của một mảng


thời gian
nhỏ df

enter image description here

lớn df
df = pd.DataFrame(dict(GROUP=np.arange(1000000) % 100, VALUE=np.random.rand(1000000)))

enter image description here

lớn df
nhiều nhóm
df = pd.DataFrame(dict(GROUP=np.arange(1000000) % 10000, VALUE=np.random.rand(1000000)))

enter image description here

+2

Trong một thời gian dài tôi đã tự hỏi tại sao gấu trúc không có một phương pháp phạm vi. Tốt để biết numpy có nó. – ayhan

+0

Tôi có thiếu gì đó ở đây không? Dường như phương pháp np.ptp chỉ nhanh nhất trong trường hợp "nhỏ df". Trong các trường hợp khác, phương thức .agg ([max], [min]). Diff (axis = 1) thực hiện tốt hơn đáng kể. –

+0

@HeavyBreathing bạn đã không bỏ lỡ một điều gì. Tôi đã cung cấp một giải pháp thay thế nhưng xác nhận giải pháp của một người đăng khác. – piRSquared

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