Pandas数据透视表 - ValueError:索引包含重复的条目,无法重塑

时间:2016-12-09 00:07:07

标签: python pandas matplotlib seaborn

Seaborn Heatmap 我想在我的seaborn热图中添加列(其他年份的数据)。 这是我正在使用的代码:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame({'Month': ['January','February','March','April','May','June','July','August','September','October','November','December',
                             'January','February','March','April','May','June','July','August','September','October','November','December'],
                   'Year': [2011,2011,2011,2011,2011,2011,2011,2011,2011,2011,2011,2011,
                            2012,2012,2012,2012,2012,2012,2012,2012,2012,2012,2012,2012,],
                   'hPM2.5': [18,17,21,14,7,7,8,7,9,11,23,5,
                              18,17,21,14,7,7,8,7,9,11,23,5,
                              18,17,21,14,7,7,8,7,9,11,23,5,
                              18,17,21,14,7,7,8,7,9,11,23,5]})

cats = ['January','February','March','April','May','June',
    'July','August','September','October','November','December']
df['Month'] = df['Month'].astype('category', 
                              ordered=True,
                              categories=cats)

df2 = df.pivot("Month", "Year", "hPM2.5")
sns.heatmap(df2, annot=True)

因此,为了尝试获取2012年数据,数据透视表似乎需要24个Jan,Feb等以及2011年,2011年...... 2012年,2012年的条目...否则我得到: ValueError:数组必须全长相同。但是当我重复1月,2月等时,它会给出这个重复值错误。如果不使用seaborn示例给出的数据透视表,我似乎无法使热图工作。我怎样才能解决这个问题呢?

2 个答案:

答案 0 :(得分:1)

问题在于构建您的数据框,您为48传递了hPM2.5的长度列表,并为24和{{1}传递了Month }。

这很好用:

Year

Seaborn heatmap

答案 1 :(得分:0)

据我了解您的问题,您不希望每年重复1月至12月,并在输入数据中复制每个月的年份。如果是这种情况,那么您真正需要做的就是将其输入到.pivot()中的表示中。在对输入数据进行一点清理后,df2.to_dict(orient="list")会给出:

{2011: [18, 17, 21, 14, 7, 7, 8, 7, 9, 11, 23, 5],
 2012: [18, 17, 21, 14, 7, 7, 8, 7, 9, 11, 23, 5]}

然后你可以这样做:

df = pd.DataFrame({2011: [18, 17, 21, 14, 7, 7, 8, 7, 9, 11, 23, 5], 
                   2012: [18, 17, 21, 14, 7, 7, 8, 7, 9, 11, 23, 5]}, index=cats)
sns.heatmap(df, annot=True)