迭代两个大型数据框以提取值的方式进行矢量化?

Posted

技术标签:

【中文标题】迭代两个大型数据框以提取值的方式进行矢量化?【英文标题】:iterate over two large dataframes to pull values way to vectorize? 【发布时间】:2020-03-20 03:32:50 【问题描述】:

我有一个 1mm 行的数据框,看起来像这样

shipname       timestamp
0                  11/1/2019
0                  11/2/2019
...                  ...
100                10/1/2018

我有第二个数据框,其中包含以下一系列数据

shipname       dateorigin     datedestination
0                10/1/2019       10/5/2019
0                10/20/2019      11/10/2019
...
99               11/1/2019       11/20/2019

如果 shipname 在 DataFrame 2 中并且时间戳在 dateorigin 和 datedestination 之间,我想运行一个返回 DF2 中的索引的函数。

目前我正在使用 df.iterrows 执行此操作,但它会降低我的 PC 速度并使 python 几乎无法使用。在某些情况下,DF2 中可能存在 >1 值,这是真的(在这种情况下,我只想返回第一个值)。到目前为止我一直在使用代码

for t in shipbase.itertuples():
    try:
        idx = (t.shipname== df.shipname) & (t.Timestamp >= df.DateOrigin) & (
                t.Timestamp <= df.DateDestination)
        list_index.append(df.loc[idx].index.values)
    except ValueError:
        list_index.append(np.nan)
        print(t)

any help to get this code to work better / optimize would be greatly appreciated. I have been trying to vectorize, but cant think of an easy solution. 


【问题讨论】:

见合并 + series.between 【参考方案1】:

如果您没有耗尽内存,您可以尝试以下方法:

df = pd.merge(df1, df2, how='inner', on='shipname')
# If you can do the merge, and run out of memory after, try to delete df1 and df2 by
# del df1, df2

df= df[df['timestamp'].between(df['dateorigin'], df['datedestination'])]

请注意 pd.merge 可以复制您的某些行,因为 shipname 值看起来在任一数据帧中都不是唯一的

【讨论】:

以上是关于迭代两个大型数据框以提取值的方式进行矢量化?的主要内容,如果未能解决你的问题,请参考以下文章

与迭代两个大型 Pandas 数据框相比,效率更高

如何在datagridview上放置一个组合框以编程方式迭代一个集合

加入两个数据框以获得笛卡尔积[重复]

如何在熊猫中合并两个数据框以替换 nan

比较两个迭代器并检查哪些元素被添加,删除或两者之间相同

如何对使用其自身输出的滞后值的函数进行矢量化?