私はトランザクションデータを読むことができるように私のデータを変換する助けが必要です。列内の条件に基づいてグループ/クラスを作成する
ビジネスケース
私はイベントのいくつかのグループまたはクラスを作成するために一緒にグループにいくつかの関連する取引をしようとしています。このデータセットは、さまざまな欠席イベントの外出中の労働者を表します。休暇イベントクラスの365日以内に行われた取引に基づいて、1つのクラスの葉を作成したいと考えています。傾向をグラフ化するために、クラスに番号を付けてシーケンス/パターンを取得する必要があります。
私のコードでは、最初のイベントがいつ発生したかを知ることができ、新しいクラスがいつ始まるかを識別できますが、各トランザクションをクラスにバケット化しません。
要件:
- タグのすべての行に基づいて、クラスを残して、何が彼らがに分類されます。
- 各ユニーク離脱イベントに番号を付けます。この例のインデックス0はユニーク離脱イベント2、インデックス1はユニーク離脱イベント2、インデックス3はユニーク離脱イベント2、ANDインデックス4はユニーク離脱イベント1などです。
希望の出力の列に「希望出力」というラベルが付けられています。 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
これは洗練されたソリューションです。 OPが本当に巨大なデータフレームを使用しているにもかかわらず、データの内容から判断すると、「マージ」に唯一の危険が存在する可能性があります。 – Khris