2015-05-15 4 views
4

Я пытаюсь умножить N столбцов в DataFrame по N столбцов в одной и той же DataFrame, а затем разделить результат на один столбец. У меня проблемы с первой частью, см. Пример ниже.Умножение несколько столбцов в DataFrame

import pandas as pd 
from numpy import random 

foo = pd.DataFrame({'A':random.rand(10), 
        'B':random.rand(10), 
        'C':random.rand(10), 
        'N':random.randint(1,100,10), 
        'X':random.rand(10), 
        'Y':random.rand(10), 
        'Z':random.rand(10), }) 

foo[['A','B','C']].multiply(foo[['X','Y','Z']], axis=0).divide(foo['N'], axis=0) 

То, что я пытаюсь получить на это столбцам умножение (т.е. A*X, B*Y, C*Z) Результат не матрица N колонка, но один, где столбцы I пытаемся умножить добавляются в DataFrame, и все записи имеют NaN значения, например, так:

A B C X Y Z 
0 NaN NaN NaN NaN NaN NaN 
1 NaN NaN NaN NaN NaN NaN 
2 NaN NaN NaN NaN NaN NaN 
3 NaN NaN NaN NaN NaN NaN 
4 NaN NaN NaN NaN NaN NaN 
5 NaN NaN NaN NaN NaN NaN 
6 NaN NaN NaN NaN NaN NaN 
7 NaN NaN NaN NaN NaN NaN 
8 NaN NaN NaN NaN NaN NaN 
9 NaN NaN NaN NaN NaN NaN 

Что здесь происходит, и как это сделать столбцы умножения?

+0

Проблема здесь состоит в том, что выравнивание будет происходить там, где у вас есть имена столбцов или значения индекса, здесь значения индекса отлично это тот факт, у вас есть имена столбцов, как вы перемножения столбцов, где имена столбцов Ф.О. не согласны результат это 'NaN' вам нужно преобразовать в значения numpy массива, обратившись к атрибуту' .values', как ответ Александра – EdChum

ответ

1

Это будет работать, используя значения из столбцов X, Y, Z и N, но, возможно, это поможет вам увидеть, что вопрос:

>>> (foo[['A','B','C']] 
    .multiply(foo[['X','Y','Z']].values) 
    .divide(foo['N'].values, axis=0)) 
      A   B   C 
0 0.000452 0.004049 0.010364 
1 0.004716 0.001566 0.012881 
2 0.001488 0.000296 0.004415 
3 0.000269 0.001168 0.000327 
4 0.001386 0.008267 0.012048 
5 0.000084 0.009588 0.003189 
6 0.000099 0.001063 0.006493 
7 0.009958 0.035766 0.012618 
8 0.001252 0.000860 0.000420 
9 0.006422 0.005013 0.004108 

Результат индексируется по столбцам A, B, C . Неясно, какими должны быть итоговые столбцы, поэтому вы получаете NaNs.

Добавление функции выше с помощью .values даст вам результат, который вы желаете, но вместо этого вы должны заменить индекс и столбцы.

>>> (foo[['A','B','C']] 
    .multiply(foo[['X','Y','Z']].values) 
    .divide(foo['N'].values, axis=0)).values 
array([[ 4.51754797e-04, 4.04911292e-03, 1.03638836e-02], 
     [ 4.71588457e-03, 1.56556402e-03, 1.28805803e-02], 
     [ 1.48820116e-03, 2.95700572e-04, 4.41516179e-03], 
     [ 2.68791866e-04, 1.16836123e-03, 3.27217820e-04], 
     [ 1.38648301e-03, 8.26692582e-03, 1.20482313e-02], 
     [ 8.38762247e-05, 9.58768066e-03, 3.18903965e-03], 
     [ 9.94132918e-05, 1.06267623e-03, 6.49315435e-03], 
     [ 9.95764539e-03, 3.57657737e-02, 1.26179014e-02], 
     [ 1.25210929e-03, 8.59735215e-04, 4.20124326e-04], 
     [ 6.42175897e-03, 5.01250179e-03, 4.10783492e-03]])