日と呼ばれる、月の一意の稼働日のリストを含むデータフレームがあります。
従業員が勤務を報告した日数のリストを含む別のデータフレームがあります。これはreportedと呼ばれます。
従業員が出勤しなかった日を見つけようとしています。
以下に、データフレームのサンプルビューを示します。
days
11/1/2018
11/2/2018
11/3/2018
11/4/2018
11/5/2018
11/6/2018
11/7/2018
報告されたと呼ばれるデータフレームのビュー:
emp_id, date
1001,11/1/2018
1001,11/2/2018
1002,11/1/2018
1002,11/3/2018
1003,11/3/2018
期待される出力(従業員が報告しなかった日数をリストします):
emp_id,date
1001,11/3/2018
1002,11/2/2018
1003,11/1/2018
1003,11/2/2018
更新最初のデータフレームを以下のように作成しました
import numpy as np
df_1 = np.sort(df_master.date.unique())
df_1_df = pd.DataFrame(df_1)
df_1_df.columns
RangeIndex(start=0, stop=1, step=1)
あなたは必要merge
インナーその後、参加して、デフォルトでreindex
すべてのユニークな値でemp_id
とdate
最後の、merge
パラメータを指定してindicator=True
いないと報告行をフィルタリングするため:
reported['date'] = pd.to_datetime(reported['date'])
df1 = reported.set_index(['emp_id', 'date'])
mux = pd.MultiIndex.from_product(df1.index.levels, names=df1.index.names)
df3 = (df1.reindex(mux)
.reset_index()
.merge(reported, indicator=True, how='outer')
.query('_merge != "both"')
.drop('_merge', axis=1))
print (df3)
emp_id date
2 1001 2018-11-03
4 1002 2018-11-02
6 1003 2018-11-01
7 1003 2018-11-02
別の解決策、@ IMCoinsのおかげisin
で~
、ブールマスクを反転するためにwithでフィルタリングしています。
df2 = df1.reindex(mux)
df3 = df2[~df2.index.isin(df1.index)].reset_index()
print (df3)
emp_id date
0 1001 2018-11-03
1 1002 2018-11-02
2 1003 2018-11-01
3 1003 2018-11-02
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加