Как сделать групповую и корреляцию по строкам в pandas df? - PullRequest
2 голосов
/ 30 января 2020

У меня есть pandas df, как показано ниже, где может быть несколько групп с именами и переменными x1, x2, x3 et c.

group name    x1        x2        x3
1      A      32        21        34
1      B      12        13        14
1      C      12        14        16
2      A      23        19        26
2      B      18        28        45
2      C      12        46        13

Я хотел бы сформировать матрицу корреляции между именами для каждой отдельной группы, как показано ниже:

group 1
       A                           B                                              C
A      1        correlation between A and B in Group 1        correlation between A and C in Group 1
B      ``                          1                                              ``
C      ``                         ``                                              1

group 2
       A                           B                                              C
A      1        correlation between A and B in Group 2        correlation between A and C in Group 2
B      ``                          1                                              ``
C      ``                         ``                                              1

Могу ли я спросить, какие функции в pandas позволят мне получить такую ​​матрицу корреляции? Спасибо!

Ответы [ 2 ]

1 голос
/ 30 января 2020

Мой подход с DataFrame.melt и DataFrame.pivot_table

corr_df = (df.melt(['group','name'])
             .pivot_table(index = ['group','variable'],
                          columns = 'name',
                          values = 'value')
             .groupby('group')
             .corr()
            #.apply(pd.DataFrame.corr) #if previous line doesn't work
          )
print(corr_df)
name               A         B         C
group name                              
1     A     1.000000  0.142857  0.142857
      B     0.142857  1.000000  1.000000
      C     0.142857  1.000000  1.000000
2     A     1.000000  0.556267 -0.892854
      B     0.556267  1.000000 -0.122427
      C    -0.892854 -0.122427  1.000000

Деталь

print(df.melt(['group','name'])
        .pivot_table(index = ['group','variable'],
                      columns = 'name',
                      values = 'value'))
name             A   B   C
group variable            
1     x1        32  12  12
      x2        21  13  14
      x3        34  14  16
2     x1        23  18  12
      x2        19  28  46
      x3        26  45  13
0 голосов
/ 30 января 2020

Проще изменить форму DataFrame, чтобы корреляция проходила вдоль столбцов, позволяя вам groupby и применять pd.DataFrame.corr напрямую.

(df.set_index(['group', 'name'])
   .stack().unstack('name')
   .groupby('group')
   .apply(pd.DataFrame.corr)
)

name               A         B         C
group name                              
1     A     1.000000  0.142857  0.142857
      B     0.142857  1.000000  1.000000
      C     0.142857  1.000000  1.000000
2     A     1.000000  0.556267 -0.892854
      B     0.556267  1.000000 -0.122427
      C    -0.892854 -0.122427  1.000000
...