迭代两个大型数据框以提取值的方式进行矢量化?
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
值看起来在任一数据帧中都不是唯一的
【讨论】:
以上是关于迭代两个大型数据框以提取值的方式进行矢量化?的主要内容,如果未能解决你的问题,请参考以下文章