Python枢轴数据框值

时间:2018-11-22 01:33:35

标签: python pandas dataframe pivot

请告诉我这是否是寻求帮助的错误方法。

例如我有以下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

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

进行编辑以添加说明:
我想不出一个更好的解决方案,能够获得与您的excelivot_table类似的总和。我所做的是从df数据帧中创建了两个数据透视表df1df2来切换列和索引。然后,我使用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)


enter image description here

答案 1 :(得分:0)

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()