Транспонировать Pandas фрейм данных, сохраняя индекс - PullRequest
0 голосов
/ 18 февраля 2020

У меня проблема с транспонированием Pandas DataFrame, который имеет следующую структуру:

            0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16
foo         0  4  0  0  0  0  0  0  0  0  14   1   0   1   0   0   0
bar         0  6  0  0  4  0  5  0  0  0   0   0   0   0   1   0   0
lorem       1  3  0  0  0  1  0  0  2  0   3   0   1   2   1   1   0
ipsum       1  2  0  1  0  0  1  0  0  0   0   0   4   0   6   0   0
dolor       1  2  4  0  1  0  0  0  0  0   2   0   0   1   0   0   2
..

С индексом:

foo,bar,lorem,ipsum,dolor,...

И это в основном матрица условий документов где строки - это термины, а заголовки (0-16) - индексы документов. Поскольку моя цель - кластеризация документов, а не терминов, я хочу транспонировать фрейм данных и использовать его для вычисления косинус-расстояния между самими документами. Но когда я переставляю с:

pd.transpose()

, я получаю:

   foo       bar    ...       pippo                     lorem
0    0         0    ...       0                         0
1    4         6    ...       0                         0
2    0         0    ...       0                         0
3    0         0    ...       0                         0
4    0         4    ...       0                         0
..
16   0         2    ...       0                         1

С индексом:

0 , 1 , 2 , 3 , ... , 15, 16

Что бы я хотел? Я ищу способ сделать эту операцию, сохраняя индекс фрейма данных. По сути, первая строка моего нового df должна быть индексом.

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Предполагая, что данные представляют собой квадратную матрицу (nxn), и если я правильно понимаю вопрос

 df = pd.DataFrame([[0, 4,0], [0,6,0], [1,3,0]], 
                   index =['foo', 'bar', 'lorem'], 
                   columns=[0, 1, 2]
                   )
 df_T = pd.DataFrame(df.values.T, index=df.index, columns=df.columns)
0 голосов
/ 18 февраля 2020

Мы можем использовать серию unstack

df2 = df.unstack().to_frame().unstack(1).droplevel(0,axis=1)

print(df2)


   foo bar lorem ipsum dolor
0    0   0     1     1     1
1    4   6     3     2     2
2    0   0     0     0     4
3    0   0     0     1     0
4    0   4     0     0     1
5    0   0     1     0     0
6    0   5     0     1     0
7    0   0     0     0     0
8    0   0     2     0     0
9    0   0     0     0     0
10  14   0     3     0     2
11   1   0     0     0     0
12   0   0     1     4     0
13   1   0     2     0     1
14   0   1     1     6     0
15   0   0     1     0     0
16   0   0     0     0     2
...