Значения данных в фрейме Python Pivot - PullRequest
0 голосов
/ 22 ноября 2018

Пожалуйста, дайте мне знать, если это неправильный способ обращения за помощью.

Например, у меня есть следующий DataFrame:

l1   l2   value
----------------
a     d     1000
b     e     2000 
c     f     4500    
c     e     500
d     a     200

Я хотел бы создать сводную таблицу /или поверните его так, чтобы и строки, и столбцы = ['a', 'b', 'c', 'd', 'e', ​​'f']

columns    a    b    c    d     e    f
rows
a                        1000 
b                              2500
c                               500  4500
d         200
e
f

После чего сортируйте обастроки и столбцы в соответствии со значением и график как тепловая карта.Я смог построить только тепловую карту со строками = l1, столбцы = l2 (с кодом ниже) и застрял на некоторое время

df = df.pivot(index='l1', columns='l2', values='value')
min= max(df['value'])
max = min(df['value'])
cmap = sns.cubehelix_palette(as_cmap=True, light=.5)
sns.heatmap(df, cmap=cmap,vmin=min,  vmax=max,mask=df.isnull(),linewidths=.008)  
plt.show(

Я также приложил скриншот в Excel для желаемоговывод вывод скриншота в excel

Цените любую помощь.

Ответы [ 2 ]

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

Heat Map

У вас есть несколько небольших проблем с вашим кодом, в первую очередь из-за того, что вы действительно не должны переопределять основные переменные, такие как min / max!:)

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

%matplotlib inline
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
df = pd.DataFrame([
    ('a', 'd', 1000),
    ('b', 'e', 2000),
    ('c', 'f', 4500),
    ('c', 'e', 500),
    ('d', 'a', 200)
], columns=['l1', 'l2', 'value'])
dfp = df.pivot(index='l1', columns='l2', values='value')
minv = max(df['value'])
maxv = min(df['value'])
cmap = sns.cubehelix_palette(as_cmap=True, light=.5)
dfp.loc[:, 'rowsum'] = dfp.sum(axis=1)
dfp.loc['colsum', :] = dfp.sum(axis=0)
dfp = (
    dfp
    .sort_values('rowsum', ascending=False, axis=0)
    .sort_values('colsum', ascending=False, axis=1)
    .drop('rowsum', axis=1)
    .drop('colsum', axis=0)
)
sns.heatmap(dfp, cmap=cmap,vmin=minv,  vmax=maxv,mask=dfp.isnull(),linewidths=.008)
plt.show()
0 голосов
/ 22 ноября 2018

Редактирование, чтобы добавить объяснение:
Я не мог придумать лучшего решения, чтобы можно было получить суммы, аналогичные вашей Excel pivot_table.То, что я сделал, из df фрейма данных, я создал две сводные таблицы df1, df2, переключая столбцы и индекс.Затем я использовал pd.concat .pd.concat definition Объединение объектов pandas вдоль определенной оси с необязательной логикой установки вдоль других осей. , чтобы объединить два кадра данных.Ссылка здесь

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html#pandas-concat

Так что, если вы запустите этот df_final = pd.concat([df2,df1],axis=0,sort=True) вместо строки 4, вы увидите, что он просто объединен по столбцам.

Тогда groupby будетв некоторой степени похож на сводную, Группировать ряды с помощью картографа (функция dict или key, применять данную функцию к группе, возвращать результат в виде ряда) или с помощью ряда столбцов. Ссылка здесь https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html#pandas-dataframe-groupby

Поскольку pd.concat выдает по 2 строки в каждой, groupby суммирует эти строки вместе, чтобы получить окончательный кадр данных

Original
Должен быть лучший способ сделать это, но этот метод кажетсяработать.df = pd.DataFrame ({'l1': ['a', 'b', 'c', 'c', 'd'], 'l2': ['d', 'e', ​​'f','e', 'a'], 'value': [1000,2000,4500,500,200]}) df1 = df.pivot_table (index = 'l2', column = 'l1', values ​​= 'value') df2 =df.pivot_table (index = 'l1', columns = 'l2', values ​​= 'value') df_final = pd.concat ([df2, df1], axis = 0, sort = True) .reset_index (). groupby ('index '). sum () min = df [' value ']. max () max = df [' value ']. min () cmap = sns.cubehelix_palette (as_cmap = True, light = .5) sns.heatmap (df_final, cmap = cmap, vmin = min, vmax = max, mask = df_final.isnull (), ширина линий = .008)


enter image description here

...