Как объединить два кадра данных на основе столбца даты?

#python #pandas #dataframe #numpy #merge

Вопрос:

У меня есть два кадра данных, которые нужно объединить.

Мой Вклад

Фрейм1 данных:

       Date         |Employee Name  |Non-Billable  |Billable     |Utilization


0     30-04-2021    |John           |92.82         |NaN          |0.9282

1     30-04-2021     |Michael        |66.66         |26.20        |0.9286
 
2     31-05-2021     |Peter          |98.20         |NaN          |0.9820

3     30-06-2021     |James          |15.93         |88.72        |1.0465

4     30-04-2021     |Stephen        |116.09        |NaN        |1.1609
 

Кадр данных 2:

  Employee Name         |Date           |Amount  
    
James                  |2021-04-30     |120000.000000

John                   |2021-04-30     |32967.032967
                       |2021-05-31     |34065.934066
                       |2021-06-30     |32967.032967

Peter                  |2021-04-30     |266626.080000
 

Код

 df1 = df1.set_index(['Date','Employee Name']).unstack('Employee Name').resample('M').sum(min_count=1).stack('Employee Name',dropna=False).reset_index()
        df1['Date'] = pd.to_datetime(df1['Date'], format='%y/%m/%d %H:%M:%S').dt.strftime('%d-%m-%Y')
        print("DF1 : ", df1.head())

df2.rename(columns={'Start Date':'Date'},inplace=True)
df2['Date'] = pd.to_datetime((df4['Date']).dt.strftime("%m-%d-%Y"))
df2= df2.set_index ('Date').groupby('Employee Name')["Amount"].resample('M').sum(min_count=1)
        print("DF2 : ", df2.head())

 # Merge the dataframes

        #df3 = pd.merge(df1, df2[['Employee Name', 'Amount']], on ='Employee Name', how='left').groupby(["Date", "Employee Name"], as_index=False).max()
        df3 = pd.merge(df1, df2, on='Employee Name', how='left')
        df3 = df3.set_index(['Date', 'Employee Name', 'Utilization'])

    df3['Billable_hr'] = df3['Amount'].div(df3['Billable']).round(2)
        sum1 = df3[["Non-Billable", "Billable"]].sum(axis=1, min_count=1)
        df3['Employee_hr'] = df3['Amount'].div(sum1).round(2)
 

Мой Вывод:

введите описание изображения здесь

Мой ожидаемый результат:

введите описание изображения здесь

Как решить эту проблему?

Комментарии:

1. Вы должны объединить df1 и df2 ['Date', 'Employee Name'] , в настоящее время вы объединяетесь только по имени

2. Постоянный Pon, если я включу столбец ДАТЫ — ошибка получения

3. В чем заключается ошибка? Попробуйте сбросить индекс на df2, прежде чем выполнять слияние как по дате, так и по имени.

4. Большое спасибо, ПерманентПон, это работает

Ответ №1:

Необходимо изменить две вещи.

Перед выполнением слияния сбросьте индекс: df2.reset_index(inplace=True)

Слияние должно быть выполнено в двух столбцах df3 = pd.merge(df1, df2, on=['Date', 'Employee Name'], how='left')