两个大数据集的最快迭代合并

4

我正在解决一个模拟问题,其中需要快速启动一些数据。这是问题:假设我们有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到10000),这最终需要很长时间。有没有更聪明的方法来利用向量运算或其他Pandas特定的优化?我想有一种优雅的一行合并/连接/联接的解决方案,但我似乎无法想出来。
我还尝试了使用itertuples而不是iterrows,如此处建议:https://github.com/pandas-dev/pandas/issues/10334,但执行时间没有显著改善。
提前致谢!

1
Numpy的笛卡尔积在这个链接中有一个相当令人印象深刻的讨论,可以帮助你完全优化它。 - ALollz
从来没有想到这是一个笛卡尔积问题!感谢您指出。 - Madoo
1个回答

3

可能有更快的基于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

1
这是一个巧妙的一行代码。我对这个解决方案进行了基准测试,它的速度要快得多。谢谢! - Madoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接