Группируйте значения и удаляйте дубликаты групп на основе столбца в Pandas - PullRequest
1 голос
/ 28 мая 2020

У меня есть файл данных, который является результатом объединения нескольких источников, содержащих информацию об имени. Каждое имя имеет уникальный идентификатор (идентификатор столбца). Сортировка идентификатора по столбцу, я хотел бы удалить второй / третий источник, найденный в столбце Источник.

Мой результат сегодня:

(все красные строки - это «дубликаты», поскольку мы уже получили их из первого источника (синие строки))

enter image description here

Что бы я хотелось бы добиться:

enter image description here

Как я могу добиться такого результата? Есть ли способ перебирать строку за строкой, когда я удаляю дубликат идентификатора уже при повторении в части кода функции «for file in files:»? Или проще сделать это в «df_merged», прежде чем я выведу фрейм данных в файл Excel?.

Код:

import pandas as pd
import os
from datetime import datetime
from shutil import copyfile
from functools import reduce
import numpy as np



#Path
base_path = "G:/Till/"

# Def
def get_files(folder, filetype):
    list_files = []
    directory = os.fsencode(folder)
    for file in os.listdir(directory):
        filename = os.fsdecode(file)
        if filename.endswith("." + filetype.strip().lower()):
            list_files.append(filename)
    return list_files


# export files
df_result_e = pd.DataFrame()

files = get_files(base_path + "datasource/" + "export","xlsx")
df_append_e = pd.DataFrame()

for file in files:
    df_temp = pd.read_excel(base_path + "datasource/" + "export/" + file, "Results", dtype=str, index=False)
    df_temp["Source"] = file
    df_append_e = pd.concat([df_append_e, df_temp])


df_result_e = pd.concat([df_result_e, df_append_e])


print(df_result_e)


# match files
df_result_m = pd.DataFrame()

files = get_files(base_path + "datasource/" + "match","xlsx")
df_append_m = pd.DataFrame()

for file in files:
    df_temp = pd.read_excel(base_path + "datasource/" + "match/" + file, "Page 1", dtype=str, index=False)
    df_append_m = pd.concat([df_append_m, df_temp])

df_result_m = pd.concat([df_result_m, df_append_m])
df_result_m = df_result_m[['ID_Our','Name_Our','Ext ID']]
df_result_m.rename(columns={'ID_Our' : 'ID', 'Name_Our' : 'Name' , 'Ext ID' : 'Match ID'}, inplace=True)
df_result_m.dropna(subset=["Match ID"], inplace=True) # Drop all NA


data_frames = [df_result_e, df_result_m]

# Join files
df_merged = reduce(lambda  left,right: pd.merge(left, right, on=["Match ID"], how='outer'), data_frames)

#Output of files
df_merged.to_excel(base_path + "Total datasource Export/" +  datetime.now().strftime("%Y-%m-%d_%H%M") + ".xlsx", index=False)

1 Ответ

1 голос
/ 28 мая 2020

Для их удаления вы можете попробовать transform с factorize

newdf=df[df.groupby('ID')['Source'].transform(lambda x : x.factorize()[0])==0]
...