Как преобразовать m-by-m фрейм данных в m * m-by-3 фрейм данных в пандах? - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть такой фрейм данных для панд:

df = pd.DataFrame({'A':[1,3,2,9],'B':[2,1,2,7],'C':[7,2,4,6],'D':[8,1,6,4]},index=['A','B','C','D'])

>>  A    B    C    D
  A 1    2    7    8
  B 3    1    2    1
  C 2    2    4    6
  D 9    7    6    4

Я хочу изменить этот фрейм данных на пары с соответствующими значениями, например:

>> col1 col2 val
    A    A    1
    A    B    3
    A    C    2
    A    D    9
   ...  ...  ...
    D    C    6
    D    D    4

В одну сторонусделать это использовать цикл, но это будет очень медленно с очень большими кадрами данных.Возникают вопросы, которые решают аналогичную проблему, но для R. Один из способов, который я предполагаю, - преобразовать фрейм данных в пустую матрицу и затем использовать функцию стека.Но я не могу создать из него массив размером 3 на 3.Может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

нарезка

Аналогично одному из ответов Джезраэль.Разница в том, что я создаю целочисленные индексы для нарезки.Это позволяет мне нарезать двумерный массив df.values вместо ravel.Это вопрос вкуса / предпочтения.

n, m = df.shape
i = np.tile(np.arange(n), m)
j = np.arange(m).repeat(n)

pd.DataFrame(dict(
    col1=df.columns[j],
    col2=df.index[i],
    val=df.values[i, j]
))

   col1 col2   val
0     A    A     1
1     A    B     3
2     A    C     2
3     A    D     9
4     B    A     2
5     B    B     1
6     B    C     2
7     B    D     7
8     C    A     7
9     C    B     2
10    C    C     4
11    C    D     6
12    D    A     8
13    D    B     1
14    D    C     6
15    D    D     4
0 голосов
/ 27 ноября 2018

Используйте DataFrame.stack с Series.reset_index:

df = df.stack().reset_index()
df.columns = ['col1','col2','val']

Или раствор с крошкой с numpy.repeat, numpy.tile и ravel:

a = np.repeat(df.index, len(df.columns))
b = np.tile(df.columns, len(df))
c = df.values.ravel()

df = pd.DataFrame({'col1':a,'col2':b,'val':c})

print (df)
   col1 col2  val
0     A    A    1
1     A    B    2
2     A    C    7
3     A    D    8
4     B    A    3
5     B    B    1
6     B    C    2
7     B    D    1
8     C    A    2
9     C    B    2
10    C    C    4
11    C    D    6
12    D    A    9
13    D    B    7
14    D    C    6
15    D    D    4

Решение с другим порядком столбца val с melt и DataFrame.reset_index, для колонок того же порядка добавьте reindex:

df = (df.rename_axis('col2')
        .reset_index()
        .melt('col2', var_name='col1', value_name='val')
        .reindex(columns=['col1','col2','val']))

a = np.repeat(df.columns, len(df.columns))
b = np.tile(df.index, len(df))
c = df.values.T.ravel()

df1 = pd.DataFrame({'col1':a,'col2':b,'val':c})

print (df)

   col1 col2  val
0     A    A    1
1     A    B    3
2     A    C    2
3     A    D    9
4     B    A    2
5     B    B    1
6     B    C    2
7     B    D    7
8     C    A    7
9     C    B    2
10    C    C    4
11    C    D    6
12    D    A    8
13    D    B    1
14    D    C    6
15    D    D    4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...