【发布时间】:2016-09-26 21:20:28
【问题描述】:
我需要帮助转换我的数据,以便阅读交易数据。
商业案例
我正在尝试将一些相关事务组合在一起以创建一些事件组或类别。该数据集代表因各种缺勤事件外出的工人。我想根据请假事件类的 365 天内的任何交易创建一类请假。为了绘制趋势图表,我想对类进行编号,以便获得序列/模式。
我的代码允许我查看第一个事件发生的时间,并且它可以识别新类何时开始,但它不会将每个事务存储到一个类中。
要求:
- 根据所有行所属的休假类别标记所有行。
- 为每个唯一离开事件编号。使用此示例索引 0 将是唯一离开事件 2,索引 1 将是唯一离开事件 2,索引 3 将是唯一离开事件 2,并且索引 4 将是唯一离开事件 1,等等。
我在所需输出的列中添加了一个标记为“所需输出”的列。请注意,每人可以有更多的行/事件;而且可以有更多的人。
一些数据
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'])
我尝试过的一些代码
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
【问题讨论】: