2017-06-28 32 views
5

Tôi có một khung dữ liệu gấu trúc của tọa độ xe (từ nhiều phương tiện trong nhiều ngày). Đối với mỗi chiếc xe và cho mỗi ngày, tôi làm hai việc: hoặc áp dụng một thuật toán cho nó, hoặc lọc nó ra khỏi tập dữ liệu hoàn toàn nếu nó không đáp ứng các tiêu chí nhất định.Xử lý dữ liệu gấu trúc theo kiểu khai báo

Để đạt được điều này tôi sử dụng df.groupby('vehicle_id', 'day') và sau đó .apply(algorithm) hoặc .filter(condition) nơi algorithmcondition là chức năng mà mất trong một dataframe.

Tôi muốn xử lý toàn bộ tập dữ liệu của mình (bao gồm nhiều bước .apply.filter) được viết theo kiểu khai báo, trái ngược với vòng lặp thông qua các nhóm, với mục tiêu của toàn bộ nội dung như:

df.group_by('vehicle_id', 'day').apply(algorithm1).filter(condition1).apply(algorithm2).filter(condition2)

Tất nhiên, các mã trên là không chính xác kể từ .apply().filter() trở dataframes mới, và điều này là chính xác vấn đề của tôi. Chúng trả về tất cả dữ liệu trong một khung dữ liệu duy nhất và tôi thấy rằng tôi đã liên tục áp dụng .groupby('vehicle_id', 'day').

Có cách nào tốt đẹp để tôi có thể viết bài này mà không cần phải nhóm theo cùng một cột nhiều lần không?

Trả lời

0

Kể từ apply sử dụng một vòng lặp for anyway (có nghĩa là không tối ưu hóa phức tạp trong nền), tôi đề nghị sử dụng một thực tế cho vòng lặp:

arr = [] 
for key, dfg in df.groupby(['vehicle_id', 'day']): 
    dfg = dfg.do_stuff1() # Perform all needed operations 
    dfg = do_stuff2(dfg) # 
    arr.append(dfg) 

result = pd.concat(arr) 

Một cách khác là để tạo ra một chức năng mà chạy tất cả các áp dụng và lọc tuần tự trên một dataframe nhất định, và sau đó ánh xạ một groupby đơn/áp dụng cho nó:

def all_operations(dfg): 
    # Do stuff 
    return result_df 

result = df.group_by(['vehicle_id', 'day']).apply(all_operations) 

trong cả hai lựa chọn, bạn sẽ phải đối phó với các trường hợp trong đó một dataframe rỗng được trả về từ các bộ lọc, nếu như vậy trường hợp tồn tại.

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