Треугольная тепловая карта из трехколоночного фрейма данных

У меня есть фреймворк с двумя категориальными столбцами и третий с целыми числами:

import pandas as pd

df1 = pd.DataFrame({
    'First': ['A','A','A','B','B','C'], 
    'Second': ['B','C','D','C','D','D'], 
    'Value': [1,2,3,4,5,6]}
)

df1

    First   Second  Value
0   A   B   1
1   A   C   2
2   A   D   3
3   B   D   4
4   B   D   5
5   C   D   6

Я хотел бы получить соответствующую треугольную матрицу, как (отсутствующие значения могут быть НА):

A B C D
  1 2 3 A
    4 5 B
      6 C

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

Любые питонические идеи о том, как этого добиться?

РЕДАКТИРОВАТЬ:

Я понял, что приведенный мной пример был слишком изящным. Мои колонки не организованы так, как указано выше. Так у меня что-то вроде этого:

df1 = pd.DataFrame({
'First': ['D','C','B','A','C','A','B','D','B','C'], 
'Second': ['E','E','C','D','D','E','E','B','A','A'], 
'Value': [1,2,3,4,5,6,7,8,9,10]}

)

      First Second  Value
0     D      E      1
1     C      E      2
2     B      C      3
3     A      D      4
4     C      D      5
5     A      E      6
6     B      E      7
7     D      B      8
8     B      A      9
9     C      A     10

и

df1.pivot('First','Second','Value')

производит

  Second    A    B      C      D      E
First                   
A          NaN  NaN     NaN     4.0     6.0
B          9.0  NaN     3.0     NaN     7.0
C         10.0  NaN     NaN     5.0     2.0
D          NaN  8.0     NaN     NaN     1.0

Нетреугольная, несимметричная матрица. Мне нужно иметь одинаковое количество строк и столбцов и подтолкнуть все эти NaN к краям, чтобы создать треугольник. Pivot не кажется возможным решением

РЕДАКТИРОВАТЬ2

Решение и желаемый результат существуют и следующие:

    A   B   C   D   E
A   NaN 9   10  4   6
B   NaN NaN 3   8   7
C   NaN NaN NaN 5   2
D   NaN NaN NaN NaN 1
E   NaN NaN NaN NaN NaN

person JRCX    schedule 23.08.2018    source источник


Ответы (1)


Вы можете pivot, а затем передать DataFrame в ваше связанное решение:

df = df1.pivot('First','Second','Value')
print (df)
Second    B    C    D
First                
A       1.0  2.0  3.0
B       NaN  4.0  5.0
C       NaN  NaN  6.0

from matplotlib import pyplot as PLT
from matplotlib import cm as CM


fig = PLT.figure()
ax1 = fig.add_subplot(111)
cmap = CM.get_cmap('jet', 10) # jet doesn't have white color
cmap.set_bad('w') # default value is 'k'
#passed DataFrame
ax1.imshow(df, interpolation="nearest", cmap=cmap)
ax1.grid(True)
PLT.show()

pic

РЕДАКТИРОВАТЬ: Решение сортирует столбцы First и Second по строкам:

df1[['First','Second']] = np.sort(df1[['First','Second']], axis=1)
df = df1.pivot('First','Second','Value')
print (df)
Second    B     C    D    E
First                      
A       9.0  10.0  4.0  6.0
B       NaN   3.0  8.0  7.0
C       NaN   NaN  5.0  2.0
D       NaN   NaN  NaN  1.0

from matplotlib import pyplot as PLT
from matplotlib import cm as CM

#
fig = PLT.figure()
ax1 = fig.add_subplot(111)
cmap = CM.get_cmap('jet', 10) # jet doesn't have white color
cmap.set_bad('w') # default value is 'k'
#passed DataFrame
ax1.imshow(df, interpolation="nearest", cmap=cmap)
ax1.grid(True)
PLT.show()

pic2

person jezrael    schedule 23.08.2018
comment
Спасибо. Но у меня все еще есть проблема отсутствия треугольной формы с большим фреймом данных / реальными данными. NaN распределены по всей оси. Я попытался выполнить сортировку с помощью df2 = df.reindex (df.sum (). Sort_values ​​(ascending = False) .index, axis = 1) и повторить для столбцов, но NaN не сдвинуты к краям. Я не могу использовать fillna с точкой поворота, потому что сортировка не приведет к треугольнику - person JRCX; 23.08.2018
comment
@JRCX - Хммм, я думаю, проблема в том, что если отсутствует какое-то значение, например df1 = pd.DataFrame({ 'First': ['A','A','B','B','C'], 'Second': ['B','C','C','D','D'], 'Value': [1,2,4,5,6]} ), pandas всегда создает 2-мерную матрицу и добавляет NaN. Думаю, для реальных данных это нормально. - person jezrael; 23.08.2018
comment
Да, и я хочу, чтобы там были NaN. Они позволят оставить половину квадрата пустой. Но в моем примере (теперь я понимаю, что это был плохой) данные аккуратные и отсортированные. В реальном примере pivot разбрасывает NaN в несортированном, не треугольном результате. - person JRCX; 23.08.2018
comment
@JRCX - Добавлено решение для вас, проверьте отредактированный ответ. - person jezrael; 23.08.2018
comment
оправдать портит данные. Созданное изображение действительно представляет собой треугольник, но строки и столбцы массива больше не соответствуют исходным столбцам и строкам сводного фрейма данных. Также нет возможности получить к ним доступ, чтобы ввести их на ось графика. - person JRCX; 23.08.2018
comment
Решение существует. Так и должно быть, так как входными данными являются все возможные комбинации между парами значений. Это переводится в треугольную матрицу. Но pivot не может этого добиться ... Отметьте Edit2, пожалуйста. Большое спасибо за вашу помощь, извините за длинную ветку, это должно быть проще - person JRCX; 23.08.2018
comment
@JRCX - Да здравствует, решение существует. Cehc отредактировал ответ. - person jezrael; 23.08.2018