熊猫-在熊猫中的两个数据框之间执行左联接

时间:2019-01-03 09:21:03

标签: python pandas dataframe

我有两个数据框(一个包含一个月中所有天的列表,另一个具有工作人员标记为出席的天数),并且我尝试执行左联接,以便我有一个包含所有日期和日期的新数据框。以及员工参加和不参加的日期。

以下是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'])

1 个答案:

答案 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