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

时间:2018-09-27 19:45:02

标签: python pandas numpy optimization vectorization

我正在研究一个模拟问题,其中一些数据需要非常快地旋转。这是问题所在:假设我们有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而不是这里推荐的iterrowshttps://github.com/pandas-dev/pandas/issues/10334,但是没有注意到执行时间有明显的改善。

谢谢!

1 个答案:

答案 0 :(得分:2)

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