Python: Как мне изменить значение в столбце A, если другое значение в столбце B повторяется? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть много файлов Excel с одинаковыми столбцами в одной папке.Мне нужно просмотреть каждый файл и сравнить, какие значения столбца «Номер пользователя» одного файла совпадают с другим файлом.А затем управляйте другим столбцом с именем «Дата», основываясь на этом.Например:

A2018_02_01 file has:          

User_Number    Date            
18732A         2017-06-22
27192B         2017-08-06    
23872Z         2017-08-06    
82716A         2017-09-18      
77629B         2017-09-12      

A2018_02_02 file has:

User_Number    Date
18732A        2017-06-22
27192B        2017-08-06
54321R         2017-12-11
23872Z        2017-11-04
18732A        2017-06-25

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

В этом случае у меня будет:

A2018_02_01 file has:          

User_Number    Date            
18732A         2017-06-22      
27192B         2017-08-06      
23872Z         2017-08-06      
82716A         2017-09-18      
77629B         2017-09-12      

A2018_02_02 file has:

User_Number    Date
18732A         2017-06-22
27192B         2017-08-06
54321R         2017-12-11
23872Z         2017-08-06
18732A         2017-06-22

Я добавил все файлы:

import os
import glob
import pandas as pd

path=r'C/.../files'
files = os.listdir(path)
df = pd.DataFrame()

for f in glob.glob(path + "/*.xlsx"):
    data = pd.read_excel(f,header=2)
    df=df.append(data)
    df["Date"]=pd.to_datetime(df["Date"], errors='coerce')

Логика не работает как логика JavaScript, поэтому я не уверен, как выполнить условие.Я пробовал:

df_number = df["User Number"]
for number in df[df_number.duplicated()]:
    number.df["Date"]number.df["Date"].min()

и другие методы, но ничего не работает.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 21 ноября 2018

Мое решение состоит в том, чтобы создать мастер-маппер со всеми минимальными датами:

master=pd.concat([df1, df2]).groupby('User_Number').min()

и затем присоединить каждый фрейм данных к мастеру, чтобы найти скорректированную дату:

df1.join(master,rsuffix='_adj',on='User_Number')[['User_Number', 'Date_adj']])
df2.join(master,rsuffix='_adj',on='User_Number')[['User_Number', 'Date_adj']])

Вывод:

    User_Number    Date_adj
0      18732A  2017-06-22
1      27192B  2017-08-06
2      23872Z  2017-08-06
3      82716A  2017-09-18
4      77629B  2017-09-12

   User_Number    Date_adj
0      18732A  2017-06-22
1      27192B  2017-08-06
2      54321R  2017-12-11
3      23872Z  2017-08-06
4      18732A  2017-06-22

Адаптируем его под свой код:

list_of_df = []
for f in glob.glob(path + "/*.xlsx"):
    data = pd.read_excel(f,header=2)
    list_of_df.append(data)

df = pd.concat(list_of_df)
df["Date"]=pd.to_datetime(df["Date"], errors='coerce')
master=df.groupby('User_Number').min()

for aux_df in list_of_df:
   aux_df['Date'] = aux_df.join(master,rsuffix='_adj',on='User_Number')[['Date_adj']])
...