我有两个数据框(一个包含一个月中所有天的列表,另一个具有工作人员标记为出席的天数),并且我尝试执行左联接,以便我有一个包含所有日期和日期的新数据框。以及员工参加和不参加的日期。
以下是df1
的样子:
days
01-01-2018
02-01-2018
03-01-2018
04-01-2018
05-01-2018
06-01-2018
07-01-2018
以下是df2
的样子:
date, emp_id
01-01-2018,101
03-01-2018,101
04-01-2018,101
06-01-2018,101
我正在尝试如下创建新的数据框:
date,marked,emp_id
01-01-2018,01-01-2018,101
02-01-2018,02-01-2018,101
03-01-2018,03-01-2018,101
04-01-2018,04-01-2018,101
05-01-2018,05-01-2018,101
06-01-2018,06-01-2018,101
在df2
中存在值的日子,如果日期在df1和df2中存在,则新的数据框应具有有效日期,否则应为null。我尝试执行以下操作,但我看到它返回了所有日期
new_df = pd.merge(df1, df2, how='left', left_on=['days'], right_on = ['date'])
答案 0 :(得分:1)
您可以执行以下操作:
new_df = pd.merge(df1, df2, how='outer', left_on=['days'], right_on = ['date'])
new_df = new_df.fillna({'emp_id': 101.0})
print(new_df)
输出
days date emp_id
0 2018-01-01 2018-01-01 101.0
1 2018-01-02 NaT 101.0
2 2018-01-03 2018-01-03 101.0
3 2018-01-04 2018-01-04 101.0
4 2018-01-05 NaT 101.0
5 2018-01-06 2018-01-06 101.0
6 2018-01-07 NaT 101.0
如果您想要某种指标列,请执行以下操作:
new_df = pd.merge(df1, df2, how='outer', left_on=['days'], right_on = ['date']).fillna({'emp_id': 101.0})
new_df['marked'] = (new_df.days == new_df.date).astype(np.uint8)
new_df = new_df.drop('date', axis=1)
print(new_df)
输出
days emp_id marked
0 2018-01-01 101.0 1
1 2018-01-02 101.0 0
2 2018-01-03 101.0 1
3 2018-01-04 101.0 1
4 2018-01-05 101.0 0
5 2018-01-06 101.0 1
6 2018-01-07 101.0 0