【问题标题】:Slow loop python to search data in antoher data frame in python慢循环python在python的另一个数据框中搜索数据
【发布时间】:2018-05-22 08:11:06
【问题描述】:

我有两个数据框:一个包含我的所有数据(称为“数据”),另一个包含每个观测开始和结束的不同站点的纬度和经度(称为“信息”),我正在尝试获取一个数据框在每个观察中,我将在每个站点旁边显示纬度和经度,我在 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个观察,每个站一个)

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

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

【问题讨论】:

  • 您能否从“数据”和“信息”数据帧中发布一些条目(它们出现在您的记忆中),并使用这些条目给我们一个示例,说明您希望输出的样子?正如所写,这个问题有点模糊。
  • 我也没有发现自己在很多地方使用 python 或这些类型的数据框结构,所以我给出的任何解决方案都可能不像人们想要的那样提供信息。但是这个结构中的数据实际上看起来如何呢?你有什么例子吗?以及为什么每次迭代都需要遍历整个帧的任何具体原因?框架是否可以按“年份”排序并通过任何 O(log n) 搜索而不是 O(n) 搜索?有关特定案例的更多信息将有助于任何潜在的帮助者为您提供更好的答案。最好的问候
  • 所以我在小范围内尝试过,我的代码实际上不起作用,我认为它确实有效,基本上我想要的是一列有纬度,然后是一列有经度然后是站号,因为我想在地图上绘制观测频率,我只是假设这是最简单的方法

标签: python pandas dataframe


【解决方案1】:

这是一种解决方案。您也可以使用pandas.merge 将2 个新列添加到data 并执行等效映射。

# 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'])

【讨论】:

  • 谢谢您的回复,我试试看是否有效
【解决方案2】:

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

1.准备数据集

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

2。优化你的脚本

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

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

作为一般规则,您不应在内部使用 for 循环和 break 它们。每当您一开始就不能准确地知道必须经过多少个循环时,您应该始终使用whiledo...while 循环。

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

这本身就是一个太大的主题,无法在此全部解释。

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

它旨在并行执行所有操作。它依赖于一个名为 MapReduce 的概念。

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

无论如何,如果你愿意使用这个框架,你可能不直接在 HDFS 上使用 MR,而是使用一个上一级,最好在内存中,例如 HDFS 之上的 SparkApache Ignite。此外,根据您的需要,尝试查看诸如 HivePigSqoop 等框架。

同样,这个主题是一个完全不同的世界,但很可能适合您的情况。随意记录所有这些概念和框架,如果需要,请在 cmets 中留下您的问题。

【讨论】:

  • 感谢您的回复,我会进一步研究 Spark 和 Apache Ignite
  • 请随时询问我是否可以提供任何帮助。请将此帖子标记为答案,以便对其他人也有用。谢谢
猜你喜欢
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 2017-12-16
  • 2018-12-24
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多