Самое быстрое итеративное объединение двух больших наборов данных - PullRequest
0 голосов
/ 27 сентября 2018

Я работаю над проблемой симуляции, когда некоторые данные нужно быстро развернуть.Вот проблема: допустим, у нас есть 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 до 10000).Что бы умнее сделать это, используя преимущества векторных операций или других специфических для Pandas оптимизаций?Я думаю, что есть элегантное решение для слияния / объединения / объединения в одну строку, но я не могу понять это.

Я также попробовал itertuples вместо iterrows, как рекомендовано здесь: https://github.com/pandas-dev/pandas/issues/10334 но не заметил значительного улучшения времени выполнения.

Заранее спасибо!

1 Ответ

0 голосов
/ 27 сентября 2018

Возможно, есть более быстрые решения на основе 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...