【发布时间】: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,而不是这里推荐的iterrows:https://github.com/pandas-dev/pandas/issues/10334,但没有注意到执行时间有显着改善。
提前致谢!
【问题讨论】:
-
Numpy cartesian product 对如何充分优化这一点进行了相当令人印象深刻的讨论。
-
永远不要告诉我这是一个笛卡尔积问题!感谢您指出这一点。
标签: python pandas numpy optimization vectorization