慢循环python在python中搜索antoher数据框中的数据

时间:2018-05-21 22:53:15

标签: python pandas dataframe

我有两个数据框:一个包含我的所有数据(称为'数据'),另一个包含不同工作站的纬度和经度,每个观察的开始和结束(称为'信息' ),我试图得到一个数据框,我在每个观察点的每个工作站旁边都有纬度和经度,我的代码在python中:

for i in range(0,15557580):
    for j in range(0,542):
         if data.year[i] == '2018' and data.station[i]==info.station[j]:
             data.latitude[i] = info.latitude[j]
             data.longitude[i] = info.longitude[j]
             break

但是因为我有大约1500万观察,这样做需要花费很多时间,有没有更快的方法呢?

非常感谢(我还是新手)

编辑:

我的文件信息如下(大约500次观察,每个电台一次)

enter image description here

我这样的文件数据(这里没有显示其他变量)(大约1500万次观察,每次旅行一次)

enter image description here

我希望得到的是,当电台号码匹配时,结果数据将如下所示:

enter image description here

2 个答案:

答案 0 :(得分:2)

这是一个解决方案。您还可以使用pandas.mergedata添加2个新列并执行等效映射。

# create series mappings from info
s_lat = info.set_index('station')['latitude']
s_lon = info.set_index('station')['latitude']

# calculate Boolean mask on year
mask = data['year'] == '2018'

# apply mappings, if no map found use fillna to retrieve original data
data.loc[mask, 'latitude'] = data.loc[mask, 'station'].map(s_lat)\
                                 .fillna(data.loc[mask, 'latitude'])

data.loc[mask, 'longitude'] = data.loc[mask, 'station'].map(s_lon)\
                                  .fillna(data.loc[mask, 'longitude'])

答案 1 :(得分:0)

当任何人开始处理大型数据集时,这是一个非常经常和重要的问题。大数据本身就是一个完整的主题,这里是对主要概念的快速介绍。

<强> 1。准备数据集

在大数据中,80%到90%的时间用于收集,过滤和准备数据集。创建数据子集,使其针对您的进一步处理进行优化。

<强> 2。优化您的脚本

短代码并不总是意味着在性能方面优化代码。在您的情况下,在不知道您的数据集的情况下,很难确切地说您应该如何处理它,您必须自己弄清楚如何在获得完全相同的结果时避免尽可能多的计算。尽量避免任何不必要的计算。

如果合适,您还可以考虑在多个线程上拆分工作。

作为一般规则,您不应在其中使用for循环和break。如果您不确切地知道首先必须经历多少循环,则应始终使用whiledo...while循环。

第3。考虑使用分布式存储和计算

这本身就是一个主题,它太大了,不能在这里解释。

以序列化方式存储,访问和处理数据对于少量数据来说速度更快,但对于大型数据集则非常不合适。相反,我们使用分布式存储和计算框架。

它的目标是并行完成所有事情。它依赖于一个名为 MapReduce 的概念。

第一个分布式数据存储框架是 Hadoop (例如 Hadoop分布式文件系统 HDFS )。该框架有其优点和缺陷,具体取决于您的应用程序。

在任何情况下,如果您愿意使用此框架,您可能更适合不直接在顶部 HDFS 上使用 MR ,但使用上层一级,最好是内存,例如 Spark Apache Ignite HDFS 之上。此外,根据您的需要,尝试查看框架,例如 Hive Pig Sqoop

同样,这个主题是一个完全不同的世界,但很可能适应你的情况。您可以随意记录所有这些概念和框架,并在评论中留下您的问题。