请告诉我这是否是寻求帮助的错误方法。
例如我有以下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中的屏幕截图 screenshot output in excel
感谢任何帮助。
答案 0 :(得分:0)
进行编辑以添加说明:
我想不出一个更好的解决方案,能够获得与您的excelivot_table类似的总和。我所做的是从df
数据帧中创建了两个数据透视表df1
,df2
来切换列和索引。然后,我使用pd.concat
。pd.concat定义沿特定轴连接熊猫对象,并沿其他轴连接可选的设置逻辑。将两个数据帧组合在一起。在这里链接
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或键函数,将给定函数应用于组,将结果作为序列返回)或按一系列列进行分组。此处链接 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html#pandas-dataframe-groupby
由于pd.concat每行产生2行,因此groupby将这些行加在一起以产生最终数据帧
原始
一定有更好的方法可以做到这一点,但是这种方法似乎行得通。
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',columns ='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(),linewidths = .008)
答案 1 :(得分:0)
您的代码有几个小问题,主要是您确实不应该覆盖诸如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()