Tôi cần trợ giúp chuyển đổi dữ liệu của mình để tôi có thể đọc qua dữ liệu giao dịch.Tạo các nhóm/lớp dựa trên các điều kiện trong các cột
Trường hợp kinh doanh
Tôi đang cố gắng để nhóm lại với nhau một số giao dịch có liên quan để tạo ra một số nhóm hoặc các lớp học của các sự kiện. Tập dữ liệu này đại diện cho những người lao động ra ngoài trên nhiều sự kiện vắng mặt khác nhau. Tôi muốn tạo một lớp lá dựa trên bất kỳ giao dịch nào nằm trong vòng 365 ngày của lớp sự kiện để lại. Đối với các xu hướng biểu đồ, tôi muốn đánh số các lớp để tôi nhận được một chuỗi/mẫu.
Mã của tôi cho phép tôi xem khi nào sự kiện đầu tiên xảy ra và nó có thể xác định khi nào một lớp mới bắt đầu, nhưng nó không xô từng giao dịch vào một lớp.
Yêu cầu:
- Tag tất cả các hàng dựa trên những gì rời khỏi lớp họ rơi vào.
- Số từng Sự kiện duy nhất để lại. Sử dụng chỉ số ví dụ 0 này sẽ là Unique Leave Event 2, chỉ mục 1 sẽ là Unique Leave Event 2, chỉ mục 3 sẽ là Unique Leave Event 2, AND index 4 sẽ là Unique Leave Event 1, v.v.
Tôi đã thêm trong một cột cho đầu ra mong muốn, được gắn nhãn là "Đầu ra mong muốn". Lưu ý, có thể có nhiều hàng/sự kiện cho mỗi người; và có thể có nhiều người hơn nữa.
Một số dữ liệu
import pandas as pd
data = {'Employee ID': ["100", "100", "100","100","200","200","200","300"],
'Effective Date': ["2016-01-01","2015-06-05","2014-07-01","2013-01-01","2016-01-01","2015-01-01","2013-01-01","2014-01"],
'Desired Output': ["Unique Leave Event 2","Unique Leave Event 2","Unique Leave Event 2","Unique Leave Event 1","Unique Leave Event 2","Unique Leave Event 2","Unique Leave Event 1","Unique Leave Event 1"]}
df = pd.DataFrame(data, columns=['Employee ID','Effective Date','Desired Output'])
Một số Mã Tôi đã thử
df['Effective Date'] = df['Effective Date'].astype('datetime64[ns]')
df['EmplidShift'] = df['Employee ID'].shift(-1)
df['Effdt-Shift'] = df['Effective Date'].shift(-1)
df['Prior Row in Same Emplid Class'] = "No"
df['Effdt Diff'] = df['Effdt-Shift'] - df['Effective Date']
df['Effdt Diff'] = (pd.to_timedelta(df['Effdt Diff'], unit='d') + pd.to_timedelta(1,unit='s')).astype('timedelta64[D]')
df['Cumul. Count'] = df.groupby('Employee ID').cumcount()
df['Groupby'] = df.groupby('Employee ID')['Cumul. Count'].transform('max')
df['First Row Appears?'] = ""
df['First Row Appears?'][df['Cumul. Count'] == df['Groupby']] = "First Row"
df['Prior Row in Same Emplid Class'][ df['Employee ID'] == df['EmplidShift']] = "Yes"
df['Prior Row in Same Emplid Class'][ df['Employee ID'] == df['EmplidShift']] = "Yes"
df['Effdt > 1 Yr?'] = ""
df['Effdt > 1 Yr?'][ ((df['Prior Row in Same Emplid Class'] == "Yes") & (df['Effdt Diff'] < -365)) ] = "Yes"
df['Unique Leave Event'] = ""
df['Unique Leave Event'][ (df['Effdt > 1 Yr?'] == "Yes") | (df['First Row Appears?'] == "First Row") ] = "Unique Leave Event"
df
Đó là một giải pháp thanh lịch. Mối nguy hiểm duy nhất có thể nằm trong 'hợp nhất' nếu OP đang sử dụng các datafram thực sự khổng lồ, nhưng xét theo nội dung của dữ liệu không chắc chắn. – Khris