Как рассчитать сумму на основе определенных чисел в кадре данных? - PullRequest
1 голос
/ 25 января 2020

У меня есть переменные, подобные этой

a = pd.DataFrame(np.array([[1, 1, 2, 3, 2], [2, 2, 3, 3, 2], [1, 2, 3, 2, 3]]))

b = np.array([0.1, 0.3, 0.5, 0.6, 0.2])

Дисплей a

   0    1      2      3      4                                         
0  1    1      2      3      2                    
1  2    2      3      3      2
2  1    2      3      2      3

Дисплей b

[0.1    0.3    0.5    0.6    0.2]

Я хочу получить сумму значений в b на основе значений a, где индексы a служат индексами для значений в b.

Окончательный результат , который Я хочу, вот так.

 0.4   0.7  0.6
   0   0.5  0.11                     
 0.1   0.9  0.7

Как получить первый ряд подробно

 0.4   0.7  0.6
  • так что 0.4 получается от 0.1 + 0.3, основываясь на числе 1 в первой строке a, т. е. поскольку индексы равны 0 и 1, мы добавляем b[0] и b[1]

  • 0.7 получается из 0.5 + 0.2, на основе числа 2, где индексы 2 и 4, поэтому мы добавили b[2] + b[4]

  • 0.6 на основе числа 3, которое просто b[3], потому что индекс 3

Ответы [ 2 ]

4 голосов
/ 25 января 2020

Вы можете создать матрицы с горячим кодированием для использования в точечном произведении:

from pandas.api.types import CategoricalDtype
n = a.max().max()
cat = CategoricalDtype(categories=np.arange(1, n + 1))
dummies = pd.get_dummies(a.T.astype(cat))
b.dot(dummies).reshape(n, n)

выход

array([[0.4, 0.7, 0.6],
       [0. , 0.6, 1.1],
       [0.1, 0.9, 0.7]])
1 голос
/ 25 января 2020

Это один из способов сделать это, он не оптимизирован, но я думаю, что он четко следует вашей логике c:

df = pd.DataFrame(columns=range(1, a.max().max()+1))
for i,r in a.iterrows():
    for c in list(df):
        df.loc[i,c] = np.sum((b[r[r==c].index.values]))

df 
     1    2    3
0  0.4  0.7  0.6
1    0  0.6  1.1
2  0.1  0.9  0.7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...