Объединение двух файлов в соответствии с несколькими значениями столбцов - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь объединить два файла, которые сконструированы так:

Первый файл - это файл CSV, сконструированный так:

Hour   Longitude Latitude 
21:30  54.05     23
22:30  54.05     23
23:30  54.05     23

Второй файл представленнапример:

Hour   Longitude Latitude Meteo
21:30  54.05     23       20 degrees
22:30  106.05    67       -5 degrees
23:30  14.05     102      12 degrees

Я хочу объединить значения первого файла со значениями второго файла только по соответствующим часам, соответствующей долготе и соответствующей широте.

Что дастмне этот файл:

Hour   Longitude Latitude Meteo
21:30  54.05     23       20 degrees
22:30  54.05     23       
23:30  54.05     23

Как видите, между этими файлами совпадают долгота и широта, поэтому новый столбец Meteo добавляется в первый файл.

1 Ответ

0 голосов
/ 03 июня 2018

Прямой подход будет выглядеть так:

df1.merge(df2, how='left')

Но это может быть быстрее при создании карты (словаря).Может быть, вы можете попробовать оба с вашим набором данных.

m = df2.set_index(['Hour','Longitude','Latitude'])['Meteo']
df1['meteo'] = [m.get(tuple(i), '') for i in df1.values]

Настройка

import pandas as pd

data1 = '''\
Hour   Longitude Latitude 
21:30  54.05     23
22:30  54.05     23
23:30  54.05     23'''

data2 = '''\
Hour   Longitude Latitude Meteo
21:30  54.05     23       20degrees
22:30  106.05    67       -5degrees
23:30  14.05     102      12degrees'''

df1 = pd.read_csv(pd.compat.StringIO(data1), sep='\s+')
df2 = pd.read_csv(pd.compat.StringIO(data2), sep='\s+')

TIMEIT

%timeit df1.merge(df2, how='left').fillna('')
%timeit m = df2.set_index(['Hour','Longitude','Latitude'])['Meteo']; df1['meteo'] = [m.get(i,'') for i in zip(df1['Hour'],df1['Longitude'],df1['Latitude'])]
%timeit m = df2.set_index(['Hour','Longitude','Latitude'])['Meteo']; df1['meteo'] = [m.get(tuple(i), '') for i in df1.values]

Возвращает

100 loops, best of 3: 3.69 ms per loop
100 loops, best of 3: 3.03 ms per loop
100 loops, best of 3: 2.99 ms per loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...