首页 > 解决方案 > 两个大型数据集的最快迭代合并

问题描述

我正在研究一个模拟问题,其中一些数据需要非常快速地旋转。这就是问题所在:假设我们有 2 个数据集 X 和 Y,我们需要一个新数据集 Z,其中 X 的每一行用于填充 Y 的新列,对 X 的每一行重复,然后合并在一起,即最终数据集Z 的大小为 len(x)*len(y)。创建数据集 Z 的最有效方法是什么?这是我到目前为止所拥有的:

X = pd.DataFrame({'simulationid':[0,1,2,3],'x1':[10,20,30,40],'x2':[1,2,3,4]})
Y = pd.DataFrame({'timeofday':[5,10,15,20],'var1':[23.5,45.0,46.4,60.3]})

最简单的选择(可能是效率最低的)是遍历每一行并填充一个新的数据框:

# loop over every configuration and generate dataset for each,
# then merge at the end
Z = pd.DataFrame()
cols2merge = ['x1','x2']
for index, row in X.iterrows():        
    for c in cols2merge:
        Y[c]=row[c]
    Z = pd.concat([Z,Y])

但是当 X 的大小增加(从 1000 到 10,000)时,这最终会花费很长时间。利用向量操作或其他 Pandas 特定的优化,有什么更聪明的方法来做到这一点?我在想有一个优雅的单行合并/合并/加入解决方案,但我似乎无法弄清楚。

我也尝试过itertuples,而不是iterrows按照这里的建议:https ://github.com/pandas-dev/pandas/issues/10334但没有注意到执行时间有显着改善。

提前致谢!

标签: pythonpandasnumpyoptimizationvectorization

解决方案


可能有更快的基于 numpy 的解决方案,但你可以做一个巨大的合并:

cols2merge = ['x1','x2']
X[cols2merge].assign(dummy=1).merge(Y.assign(dummy=1), on='dummy').drop(columns='dummy')

输出:

    x1  x2  timeofday  var1
0   10   1          5  23.5
1   10   1         10  45.0
2   10   1         15  46.4
3   10   1         20  60.3
4   20   2          5  23.5
5   20   2         10  45.0
6   20   2         15  46.4
7   20   2         20  60.3
8   30   3          5  23.5
9   30   3         10  45.0
10  30   3         15  46.4
11  30   3         20  60.3
12  40   4          5  23.5
13  40   4         10  45.0
14  40   4         15  46.4
15  40   4         20  60.3

推荐阅读