2015-05-06 6 views
0

Я прихожу из фона Excel, но я люблю панды, и это действительно сделало меня более эффективным. К сожалению, я, вероятно, переношу некоторые вредные привычки из Excel. У меня есть три больших файла (от 2 до 13 миллионов строк каждая), которые содержат данные о взаимодействиях, которые могут быть связаны между собой, к сожалению, нет уникального ключа, связывающего файлы. Я буквально конкатенация (формула Excel) 3 поля в один новый столбец во всех трех файлах.Присоединение файлов в pandas

Три столбца, которые существуют в каждом файле, который я объединил (другие поля будут похожи на причину взаимодействия в одном файле, оценку на другой файл и некоторые другие данные по третьему файлу, которые я хотел бы связать обратно к определенному agentID):

Date | CustomerID | AgentID 

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

df[Date] = pd.to_datetime(df['Date'], coerce = True) 
df[Date] = df[Date].apply(lambda x:x.date().strftime('%Y-%m-%d')) 

Затем я создаю уникальный столбец (ну, как уникальные, как я могу получить это ... иногда один и тот же клиент взаимодействует с тем же агентом в тот же день, но это должно быть довольно редко):

df[Unique] = df[Date].astype(str) + df[CustomerID].astype(str) + df[AgentID].astype(str) 

я те же шаги для df2, а затем:

combined = pd.merge(df, df2, how = 'left', on = 'Unique') 

Я обычно посылают, что новый файл CSV в случае что-то аварии, GZIP он, затем прочитайте его снова и снова выполните тот же процесс с третьим файлом.

final = pd.merge(combined, df2, how = 'left', on = 'Unique') 

Как вы можете видеть, это требует времени. Я должен отформатировать даты на каждом, а затем превратить их в текст, создать столбец объекта, который добавляет размер файла, и (из-за самих проблем с исходными данными) удалить дубликаты, чтобы я случайно не раздувал числа. Есть ли более эффективный рабочий процесс для меня?

ответ

3

Вместо использования on = 'Unique':

combined = pd.merge(df, df2, how = 'left', on = 'Unique') 

вы можете передать список столбцов в параметр on ключевого слова:

combined = pd.merge(df, df2, how='left', on=['Date', 'CustomerID', 'AgentID']) 

Панда будет правильно объединить строки на основе тройки значений от 'Date', 'CustomerID', 'AgentID' колонны. Это безопаснее (см. Ниже) и проще, чем создание столбца Unique.


Например,

import pandas as pd 
import numpy as np 
np.random.seed(2015) 

df = pd.DataFrame({'Date': pd.to_datetime(['2000-1-1','2000-1-1','2000-1-2']), 
        'CustomerID':[1,1,2], 
        'AgentID':[10,10,11]}) 

df2 = df.copy() 
df3 = df.copy() 
L = len(df) 
df['ABC'] = np.random.choice(list('ABC'), L) 
df2['DEF'] = np.random.choice(list('DEF'), L) 
df3['GHI'] = np.random.choice(list('GHI'), L) 
df2 = df2.iloc[[0,2]] 

combined = df 
for x in [df2, df3]: 
    combined = pd.merge(combined, x, how='left', on=['Date','CustomerID', 'AgentID']) 

дает

In [200]: combined 
Out[200]: 
    AgentID CustomerID  Date ABC DEF GHI 
0  10   1 2000-1-1 C F H 
1  10   1 2000-1-1 C F G 
2  10   1 2000-1-1 A F H 
3  10   1 2000-1-1 A F G 
4  11   2 2000-1-2 A F I 

предостережением примечание:

Добавление CustomerID к AgentID, чтобы создать уникальный идентификатор может быть проблематичным - особенно если ни один из них не имеет формат фиксированной ширины.

Например, если CustomerID = '12' и AgentID = '34' Тогда (не обращая внимания на дату, которая не вызывает никаких проблем, поскольку он имеет фиксированную ширину) Unique будет '1234'. Но если CustomerID = '1' и AgentID = '234', то Unique будет снова равным '1234'. Таким образом, идентификаторы Unique могут смешивать совершенно разные пары клиентов/агентов .


PS. Это хорошая идея, чтобы разобрать строки даты в дата-как объекты

df['Date'] = pd.to_datetime(df['Date'], coerce=True) 

Обратите внимание, что если вы используете

combined = pd.merge(combined, x, how='left', on=['Date','CustomerID', 'AgentID']) 

не нужно преобразовывать любого из столбцов обратно в строки.

+0

Awesome. Работал. Прекрасно спасибо. Я вернулся и редактировал все мои файлы присоединения. – trench

Смежные вопросы