Как объединить кадры данных только один раз в строке - PullRequest
1 голос
/ 16 апреля 2020

Извинения, я довольно новичок во всем этом, поэтому прошу прощения за любые глупые вопросы, которые я могу задать.

Я пытаюсь объединить пару отчетов из Salesforce, используя pandas,

У меня есть два отчета:

Отчет о труде и Отчет о заводе

, и я хочу создать: Объединенный отчет

Я попытался объединить, объединить и выровнять кадры данных, однако, поскольку эти два индекса имеют один и тот же индекс, первая строка в моем отчете о растениях повторяется 5 раз ie:

Неверно объединенный отчет

Моя следующая мысль - использовать .align (), а затем .duplicated (), чтобы вернуть логический ряд, показывающий, какие строки повторяются, и очистить содержимое строк, которые дублируются. Если бы я использовал этот метод, как я мог бы очистить содержимое строки?

Также это кажется довольно неэффективным и трудным для выполнения, есть ли более элегантные решения?

Cheers

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Предположим, что вам не потребуется дубликат столбца «Номер DJR» в вашем конечном результате. Мы можем объединить оба Dataframe на основе номера DJR. Дублированная функция вернет серию логических значений о том, дублированы они или нет. Если они истинны, мы присваиваем ему нулевое значение.

merged = labour.merge(plant,on='DJR Number')
merged.loc[merged['DJR Number'].duplicated(),['Date_y','Foreman_y','Plant','Plant Hours']] = np.NaN

Если вы хотите получить еще более чистый результат, вместо этого объедините три столбца.

merged = labour.merge(plant,on=['DJR Number','Date','Foreman'])
merged.loc[merged['DJR Number'].duplicated(),['Plant','Plant Hours']] = np.NaN

Это не приведет к любой повторяющийся столбец.

Пожалуйста, обратитесь Pandas Дублированный для документации.

0 голосов
/ 16 апреля 2020

Вот некоторые примеры данных

labour-report.csv

DJR Number,Date,Foreman,Labour Name,Start,Finish,Hours Worked
1,1/01/2020,Emersen,Tai,6:30,15:00,8:30
1,1/01/2020,Emersen,Rachel,6:30,15:00,8:30
1,1/01/2020,Emersen,Andrew,6:30,15:00,8:30
1,1/01/2020,Emersen,Liam,6:30,15:00,8:30
2,2/01/2020,Scott,Rachel,6:30,15:00,8:30
3,3/01/2020,Michael,Andrew,6:30,15:00,8:30

plant-report.csv

DJR Number,Date,Foreman,Plant,Plant Hours
1,1/01/2020,Emersen,1,5
2,1/01/2020,Scott,2,5
3,1/01/2020,Michael,2,5

Можно использовать приведенный ниже код. Логика c заключается в добавлении дополнительного столбца, чтобы отметить, нужно ли объединять строку или нет. Тогда мы можем просто выполнить слияние влево на pandas и затем удалить этот дополнительный столбец после слияния

import pandas as pd
import numpy as np

labour_report = pd.read_csv('labour-report.csv')
plant_report = pd.read_csv('plant-report.csv')


should_join_row_lbr=[]
foremen  = {}
for index, labour_report_row in labour_report.iterrows():
    foreman = labour_report_row['Foreman']
    if foreman in foremen:
        should_join_row_lbr.append(0) # Dont join this row
    else:
        foremen[foreman]=1
        # Join this row as this is the first record for the foreman
        should_join_row_lbr.append(1) 
        labour_report['Should Join Row']=should_join_row_lbr

should_join_row_plnt = [1]*plant_report['DJR Number'].count()

plant_report['Should Join Row']=should_join_row_plnt

# Do a left join with Should Join column as well, 
# Only the records that have value 1 will be joined from labour_report
combined_report = pd.merge(labour_report,plant_report,on=['Foreman','Should Join Row'],how='left') 
combined_report = combined_report.drop(columns=['Should Join Row'])
combined_report = combined_report.replace(np.nan, '', regex=True)

print(combined_report)

combined_report.to_csv('combined_report.csv') 

Должен дать результат

   DJR Number_x     Date_x  Foreman Labour Name Start Finish Hours Worked DJR Number_y     Date_y Plant Plant Hours
0             1  1/01/2020  Emersen         Tai  6:30  15:00         8:30            1  1/01/2020     1           5
1             1  1/01/2020  Emersen      Rachel  6:30  15:00         8:30                                          
2             1  1/01/2020  Emersen      Andrew  6:30  15:00         8:30                                          
3             1  1/01/2020  Emersen        Liam  6:30  15:00         8:30                                          
4             2  2/01/2020    Scott      Rachel  6:30  15:00         8:30            2  1/01/2020     2           5
5             3  3/01/2020  Michael      Andrew  6:30  15:00         8:30            3  1/01/2020     2           5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...