python - 两个大型数据集的最快迭代合并
问题描述
我正在研究一个模拟问题,其中一些数据需要非常快速地旋转。这就是问题所在:假设我们有 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 的解决方案,但你可以做一个巨大的合并:
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
推荐阅读
- javascript - Requirejs 配置捆绑选项和 r.js
- javascript - 如何在 JSONL 中对相关字段进行分组?
- c++ - 需要帮助将我从 sqlite3 DB 获得的值存储在 C++ 变量中
- kubernetes - Kubernetes 抢占不适用于资源配额
- laravel - 测试命令在终端中有效,但在 php 中无效
- c++ - 非静态数据成员类推导
- angular - 带有 ngbDatepicker 的 Angular 动态表单导致冻结
- python - 如何在熊猫中“加入”具有相同 ID 的行并将数据添加为新列
- reactjs - 将 React 子组件实现为只有特定组件时如何解决类型问题?
- sql - 按计数结果分组