2013-10-24 3 views
5

Скажем, у меня есть две серии в пандах, серия A и серия B. Как создать кадр данных, в котором все эти значения умножаются вместе, то есть с серией A слева стороны и серии В вверху. В принципе то же самое понятие, как это, где серия А будет желтый слева и серии B желтый вдоль верхней части, и все значения между ними будут заполнены путем умножения:Создание кадра данных в пандах путем умножения двух рядов вместе

http://www.google.co.uk/imgres?imgurl=http://www.vaughns-1-pagers.com/computer/multiplication-tables/times-table-12x12.gif&imgrefurl=http://www.vaughns-1-pagers.com/computer/multiplication-tables.htm&h=533&w=720&sz=58&tbnid=9B8R_kpUloA4NM:&tbnh=90&tbnw=122&zoom=1&usg=__meqZT9kIAMJ5b8BenRzF0l-CUqY=&docid=j9BT8tUCNtg--M&sa=X&ei=bkBpUpOWOI2p0AWYnIHwBQ&ved=0CE0Q9QEwBg

К сожалению, вероятно, добавил бы, что мои две серии не имеют одинаковой длины. Теперь я получаю сообщение о том, что «матрицы не выровнены», поэтому я предполагаю, что это проблема.

+0

Что вы пробовали? Вы можете отредактировать свой вопрос и добавить код, ошибки или результаты. – Theresa

ответ

2

Вы можете использовать матрицу умножения точки, но прежде чем вы должны преобразовать серии в DataFrame (потому что dot method on Series implements dot product):

>>> B = pd.Series(range(1, 5)) 
>>> A = pd.Series(range(1, 5)) 
>>> dfA = pd.DataFrame(A) 
>>> dfB = pd.DataFrame(B) 
>>> dfA.dot(dfB.T) 
    0 1 2 3 
0 1 2 3 4 
1 2 4 6 8 
2 3 6 9 12 
3 4 8 12 16 
0

Так что я думаю, что это может получить вам большую часть пути туда, если у вас есть две серии разной длины. Это похоже на очень ручной процесс, но я не могу думать о другом способе, используя pandas или NumPy.

>>>> a = Series([1, 3, 3, 5, 5]) 
>>>> b = Series([5, 10]) 

Сначала конвертировать ваши Row значения a к DataFrame и сделать копии этой серии в виде новых колонн столько, сколько у вас есть значения в ваших столбцах серий b.

>>>> result = DataFrame(a) 
>>>> for i in xrange(len(b)): 
      result[i] = a 
    0 1 
0 1 1 
1 3 3 
2 3 3 
3 5 5 
4 5 5 

Вы можете транслировать серию b над DataFrame result:

>>>> result = result.mul(b) 
    0 1 
0 5 10 
1 15 30 
2 15 30 
3 25 50 
4 25 50 

В примере я выбрал, вы будете в конечном итоге с индексами, которые являются дубликатами из-за вашей первоначальной серии. Я бы рекомендовал оставить индексы как уникальные идентификаторы. Это создает программный смысл, иначе вы вернете более одного значения, когда вы выберете индекс, который имеет более одной строки, назначенной ему. Если необходимо, вы можете проиндексировать ваши заголовки строк и столбцов этикетки с помощью этих функций:

>>>> result.columns = b 
>>>> result.set_index(a) 
    5 10 
1 5 10 
3 15 30 
3 15 30 
5 25 50 
5 25 50 

Пример дубликата индексации:

>>>> result.loc[3] 
    5 10 
3 15 30 
3 15 30 
1

Сначала создайте DataFrame из 1-х. Затем трансляция умножается вдоль каждой оси по очереди.

>>> s1 = Series([1,2,3,4,5]) 
>>> s2 = Series([10,20,30]) 
>>> df = DataFrame(1, index=s1.index, columns=s2.index) 
>>> df 
    0 1 2 
0 1 1 1 
1 1 1 1 
2 1 1 1 
3 1 1 1 
4 1 1 1 
>>>> df.multiply(s1, axis='index') * s2 
    0 1 2 
0 10 20 30 
1 20 40 60 
2 30 60 90 
3 40 80 120 
4 50 100 150 

Вы должны использовать df.multiply для того, чтобы указать, что серия будет выстраиваться с индексом строки. Вы можете использовать обычный оператор умножения * с s2, поскольку сопоставление по столбцам является способом по умолчанию для умножения между DataFrame и серией.

2

Вы можете создать DataFrame из умножения двух серий неравной длины, передавая каждое значение строки (или столбца) другим сериям. Например:

> row = pd.Series(np.arange(1, 6), index=np.arange(1, 6)) 
> col = pd.Series(np.arange(1, 4), index=np.arange(1, 4)) 
> row.apply(lambda r: r * col) 
    1 2 3 
1 1 2 3 
2 2 4 6 
3 3 6 9 
4 4 8 12 
5 5 10 15 
Смежные вопросы