Разверните матрицу в Пандах - PullRequest
0 голосов
/ 03 мая 2018

У меня есть такая матрица:

df = pd.DataFrame({'a':[7, 0, 3], 'b':[0, 4, 2], 'c':[3, 2, 9]})
df.index = list(df)
df

    a   b   c
a   7   0   3
b   0   4   2
c   3   2   9

И я бы хотел получить что-то вроде этого:

C1  C2  V
0   a   a   7
1   a   b   0
2   a   c   3
3   b   a   0
4   b   b   4
5   b   c   2
6   c   a   3
7   c   b   2
8   c   c   9

Для которого я написал следующий код:

vv = pd.DataFrame(columns=['C1', 'C2', 'V'])
i = 0
for cat1 in df.index:
    for cat2 in df.index:
        vv.loc[i] = [cat1, cat2, d[cat1][cat2]]
        i += 1
vv['V'] = vv['V'].astype(int)

Есть ли лучший / быстрый / более элегантный способ сделать это?

Ответы [ 5 ]

0 голосов
/ 03 мая 2018

Чтобы завершить ответ и получить тот же вывод, я добавил следующий код:

vv = df.stack().reset_index()
vv.columns = ['C1', 'C2', 'V']
0 голосов
/ 03 мая 2018

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

df = (df.rename_axis('C2')
        .reset_index()
        .melt('C2', var_name='C1', value_name='V')
        .reindex(columns=['C1','C2','V']))
print (df)
  C1 C2  V
0  a  a  7
1  a  b  0
2  a  c  3
3  b  a  0
4  b  b  4
5  b  c  2
6  c  a  3
7  c  b  2
8  c  c  9
0 голосов
/ 03 мая 2018
In [90]: df = df.stack().reset_index()

In [91]: df.columns = ['C1', 'C2', 'v']

In [92]: df
Out[92]: 
  C1 C2  v
0  a  a  7
1  a  b  0
2  a  c  3
3  b  a  0
4  b  b  4
5  b  c  2
6  c  a  3
7  c  b  2
8  c  c  9
0 голосов
/ 03 мая 2018

Вы можете использовать метод stack () с последующим сбросом индекса и переименованием столбцов.

df = pd.DataFrame({'a':[7, 0, 3], 'b':[0, 4, 2], 'c':[3, 2, 9]})
df.index = list(df)
result = df.stack().reset_index().rename(columns={'level_0':'C1', 'level_1':'C2',0:'V'})

print(result)

  C1 C2  V
0  a  a  7
1  a  b  0
2  a  c  3
3  b  a  0
4  b  b  4
5  b  c  2
6  c  a  3
7  c  b  2
8  c  c  9
0 голосов
/ 03 мая 2018

Вы можете использовать stack:

df.stack()

a  a    7
   b    0
   c    3
b  a    0
   b    4
   c    2
c  a    3
   b    2
   c    9
dtype: int64

pd.set_option('display.multi_sparse', False) удалит серию, показывая значения в каждой строке

Кроме того, при правильном переименовании в конвейере

df.stack()
  .reset_index()
  .rename(columns={'level_0': 'C1', 'level_1': 'C2', 0:'V'})

Выходы:

    C1  C2  V               
0   a   a   7
1   a   b   0
2   a   c   3
3   b   a   0
4   b   b   4
5   b   c   2
6   c   a   3
7   c   b   2
8   c   c   9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...