【问题标题】:Fastest iterative merge of two large datasets两个大型数据集的最快迭代合并
【发布时间】:2019-03-03 18:55:43
【问题描述】:

我正在处理一个模拟问题,其中一些数据需要非常快速地旋转。这就是问题所在:假设我们有 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,但没有注意到执行时间有显着改善。

提前致谢!

【问题讨论】:

  • Numpy cartesian product 对如何充分优化这一点进行了相当令人印象深刻的讨论。
  • 永远不要告诉我这是一个笛卡尔积问题!感谢您指出这一点。

标签: python pandas numpy optimization vectorization


【解决方案1】:

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

【讨论】:

  • 这是一个聪明的单线。我对这个解决方案进行了基准测试,它的速度要快得多。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2013-07-13
相关资源
最近更新 更多