numpy pandas np.outer (): форма переданных значений (15686, 15686), индексы подразумевают (7843, 7843) - PullRequest
1 голос
/ 01 апреля 2020

У меня есть фрейм данных в следующем формате:

Zone | Score
1       3.2
2       1.9
3       2.3

Мне нужно сделать матрицу из этой таблицы в этом формате:

    Zone 1   |  2  |  3
Zone 1  3.2   1.9   2.3
Zone 2  3.2   1.9   2.3
Zone 3  3.2   1.9   2.3

У меня уже есть связанная матрица с расстояниями в этом формате:

    Zone 1   |  2  |  3
Zone 1   0      4     7
Zone 2   4      0     8
Zone 3   7      8     0

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

Я пытался pd.DataFrame(np.outer(df, df), df.index, df.index)

И я получаю следующую ошибку:

Форма переданных значений (15686, 15686), индексы подразумевают (7843, 7843)

Что я могу сделать, чтобы получить Зону | Оценка данных кадра в матричном формате? Если есть более простой способ просто включить эти значения в существующую матрицу расстояний, где оценка делится на расстояние, это было бы еще лучше.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020
In [328]: df = pd.DataFrame([[1,2.2],[2, 1.9],[3,2.3]], columns=['zone','score'])              
In [329]: df                                                                                   
Out[329]: 
   zone  score
0     1    2.2
1     2    1.9
2     3    2.3

np.outer ожидает 2 1d массива и говорит, что входы будут сглажены, если они не 1d. Таким образом:

In [330]: np.asarray(df)                                                                       
Out[330]: 
array([[1. , 2.2],
       [2. , 1.9],
       [3. , 2.3]])
In [331]: np.asarray(df).ravel()                                                               
Out[331]: array([1. , 2.2, 2. , 1.9, 3. , 2.3])
In [332]: np.outer(_330, _330)                                                                 
Out[332]: 
array([[1.  , 2.2 , 2.  , 1.9 , 3.  , 2.3 ],
       [2.2 , 4.84, 4.4 , 4.18, 6.6 , 5.06],
       [2.  , 4.4 , 4.  , 3.8 , 6.  , 4.6 ],
       [1.9 , 4.18, 3.8 , 3.61, 5.7 , 4.37],
       [3.  , 6.6 , 6.  , 5.7 , 9.  , 6.9 ],
       [2.3 , 5.06, 4.6 , 4.37, 6.9 , 5.29]])

Это объясняет, почему ваш outer имеет в два раза больше строк и столбцов, чем indices.

numpy функции ожидают numpy массивов и преобразуют входы к таким при необходимости. Лучше, если вы сделаете преобразование правильно и с пониманием, перед тем, как делать это.

0 голосов
/ 01 апреля 2020

IIU C, DataFrame.pivot_table

new_df = (df.pivot_table(index = 'Zone', columns = 'Zone', values = 'Score')
           .ffill(axis=1)
           .bfill(axis=1))
print(new_df)

Zone    1    2    3
Zone               
1     3.2  3.2  3.2
2     1.9  1.9  1.9
3     2.3  2.3  2.3

Использование numpy

pd.DataFrame(np.vstack([df['Score'].to_numpy()]*len(df)),
             index=df['Zone'],
             columns=df['Zone'])

или

pd.DataFrame(np.tile(df['Score'].to_numpy(),len(df)).reshape(len(df), -1),
             index = df['Zone'],columns=df['Zone'])

с np.outer

np.outer(df['Score'].to_numpy(), [1]*len(df))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...