根据多个列值

时间:2018-06-03 11:24:53

标签: python python-3.x csv scikit-learn

我正在尝试合并两个构造如下的文件:

第一个文件是一个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

我想将第一个文件的值与第二个文件的值合并,仅匹配小时数,匹配经度和匹配的纬度。

Wich会给我这个档案:

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

正如您可以看到这些文件之间的小时,经度和纬度相匹配,因此新列Meteo将添加到第一个文件中。

1 个答案:

答案 0 :(得分:0)

直接的方法是:

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