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