2017-04-06 256 views
1

我想生成一個使用seaborn的熱圖,但是我的數據格式有一個小問題。大熊貓數據透視表熱圖

目前,我的數據的格式爲:

Name  Diag Date 
A  1  2006-12-01 
A  1  1994-02-12 
A  2  2001-07-23 
B  2  1999-09-12 
B  1  2016-10-12 
C  3  2010-01-20 
C  2  1998-08-20 

我想在一個軸上創建熱圖(優選地在python)表示Name針對Diag - 如果發生。我試圖轉動使用pd.pivot表,但我得到了錯誤

ValueError: Index contains duplicate entries, cannot reshape

這個來自:

PIV = df.pivot_table(指數= '名稱',列= 'Diag(診斷)')

時間是無關的,但我想顯示哪些Names已經有哪些Diag和哪些Diag組合在一起。我是否需要爲此創建一個新表,還是有可能?在某些情況下,Name並未與所有Diag

編輯相關: 因爲我已經試過: PIV = df.pivot_table(指數= '名稱',列= 'Diag(診斷)',值= '時間',aggfunc = 「是什麼意思」)

但是由於時間的日期時間格式,我結束了:
pandas.core.base.DataError:沒有數字類型聚集

+1

這個問題可以從一些代碼中得到很大的好處,這些代碼顯示了你實際上爲你的pivot語法嘗試了什麼。只顯示錯誤會讓我們任何人閱讀它都必須猜測很多。 –

回答

4

你需要pivot_table一些聚合函數,因爲相同的索引和列有多個值,並且pivot只需要唯一值:

print (df) 
    Name Diag Time 
0 A  1 12 <-duplicates for same A, 1 different value 
1 A  1 13 <-duplicates for same A, 1 different value 
2 A  2 14 
3 B  2 18 
4 B  1  1 
5 C  3  9 
6 C  2  8 

df = df.pivot_table(index='Name',columns='Diag', values='Time', aggfunc='mean') 
print (df) 
Diag  1  2 3 
Name     
A  12.5 14.0 NaN 
B  1.0 18.0 NaN 
C  NaN 8.0 9.0 

替代解決方案:

df = df.groupby(['Name','Diag'])['Time'].mean().unstack() 
print (df) 
Diag  1  2 3 
Name     
A  12.5 14.0 NaN 
B  1.0 18.0 NaN 
C  NaN 8.0 9.0 

編輯:

您還可以通過duplicated檢查所有重複:

df = df.loc[df.duplicated(['Name','Diag'], keep=False), ['Name','Diag']] 
print (df) 
    Name Diag 
0 A  1 
1 A  1 

編輯:

mean of datetimes不容易 - 需要將日期轉換爲nanoseconds,獲取平均值並最後轉換爲日期時間。還有另一個問題 - 需要將NaN替換爲某個標量,例如0什麼轉換爲0 datetime - 1970-01-01

df.Date = pd.to_datetime(df.Date) 
df['dates_in_ns'] = pd.Series(df.Date.values.astype(np.int64), index=df.index) 
df = df.pivot_table(index='Name', 
        columns='Diag', 
        values='dates_in_ns', 
        aggfunc='mean', 
        fill_value=0) 
df = df.apply(pd.to_datetime) 
print (df) 
Diag     1   2   3 
Name           
A 2000-07-07 12:00:00 2001-07-23 1970-01-01 
B 2016-10-12 00:00:00 1999-09-12 1970-01-01 
C 1970-01-01 00:00:00 1998-08-20 2010-01-20 
+0

謝謝!這很有幫助。現在的問題可能是時間實際上是數據時間格式,所以不是數字。也許我應該只添加一列作爲解決方法? – JB1

+0

我認爲這是同樣的問題。但我有想法如何檢查這個值,給我一秒鐘。 – jezrael

+0

pandas.core.base.DataError:沒有要聚合的數字類型是我當前的錯誤。 Unfortunatley我沒有把正確的數據類型放在時間的例子中,它的形式爲'2016-12-12' – JB1