2017-02-14 23 views
1

у меня есть два DataFrames, например:Broadcasting умножения два панды DataFrames

df1 = pn.DataFrame(np.arange(6).reshape(3, 2), columns=['A1', 'B1']) 
df2 = pn.DataFrame(np.arange(1,7).reshape(3, 2), columns=['A2', 'B2']) 

    A1 B1 
0 0 1 
1 2 3 
2 4 5 

    A2 B2 
0 1 2 
1 3 4 
2 5 6 

мне нужно умножить df1 и df2 колонн, чтобы получить DataFrame с следующим результатом:

A1*A2 A1*B2 B1*A2 B1*B2 
0  0  0  1  2 
1  6  8  9  12 
2 20  24  25  30 

Размерами df1 и df2 в реальной задаче (1000 столбцов х 90 000 строк).

Я не хочу использовать двойной цикл «для» по столбцам этих DataFrames.

Есть ли встроенная функция или простой способ ее вычисления?

+0

Он выглядит как многочлен со столбцами разных данных, но не с столбцами одного кадра данных – Somnambula

ответ

0

Использование broadcasting для эффективного прирост производительности:

import itertools 

df = pd.DataFrame((df1.values[..., None] * df2.values[:, None]).reshape(df1.shape[0],-1)) 
df.columns = ["*".join(i) for i in itertools.product(*[df1.columns, df2.columns])] 

enter image description here


Цель включения df1.values[..., None] заключается в создание дополнительного измерения справа, имеющей форму (3, 2, 1) от ранее (3, 2) формы df1.values.

Кроме того, df2.values[:, None] добавляет дополнительный размер к центральной оси, так что его форма становится (3, 1, 2) от начального (3,2), чтобы помочь в процессе умножения.

Наконец, reshape их взять на себя такое же количество строк, что и оригинального df1 (или) df2
(, так как одни и те же формы в вопрос упоминается).

+1

Отлично! Мне очень нравится)) Мне нужно некоторое время, чтобы изменить концепцию работы с данными в python, потому что Python - это новый язык программирования для меня. Благодаря!!! – Somnambula

+0

Если на данном этапе использование трансляции кажется подавляющим, я бы рекомендовал [этот пост] (http://scipy.github.io/old-wiki/pages/EricsBroadcastingDoc) хорошее чтение, чтобы понять эти концепции. –

0

Вы можете использовать df.multiply() умножить ДФ с серией, а затем CONCAT в результате dataframes как это:

df3 = pd.concat([df1[["A1", "B1"]].multiply(df2["A2"], axis="index"), 
df1[["A1", "B1"]].multiply(df2["B2"], axis="index")], axis = 1) 

df3.columns = ['A1*A2', "B1*A2", "A1*B2", "B1*B2"] 

Вы получаете:

 A1*A2 B1*A2 A1*B2 B1*B2 
0  0  1  0  2 
1  6  9  8  12 
2  20  25  24  30 
+0

Спасибо большое! Ваше решение работает и яснее для меня как разработчика Java – Somnambula