熊猫枢纽分析表

JB1*_*JB1 1 python pandas seaborn

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

我想创建一个热图(最好在python中)显示Name在一个轴上Diag-如果发生。我尝试使用旋转数据表pd.pivot,但是出现了错误

ValueError:索引包含重复的条目,无法重塑

来自:

piv = df.pivot_table(index ='Name',columns ='Diag')

时间无关紧要,但是我想展示哪个Names具有哪个Diag,哪个Diag组合聚集在一起。我是否需要为此创建一个新表?在某些情况下,Name并非与所有Diag

编辑:我从此尝试过:piv = df.pivot_table(index ='Name',columns ='Diag',values ='Time',aggfunc ='mean')

但是,由于时间采用日期时间格式,因此我最终得到:
pandas.core.base.DataError:没有要聚合的数字类型

jez*_*ael 5

您需要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
Run Code Online (Sandbox Code Playgroud)

替代解决方案:

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
Run Code Online (Sandbox Code Playgroud)

编辑:

您还可以通过以下方式检查所有重复项duplicated

df = df.loc[df.duplicated(['Name','Diag'], keep=False), ['Name','Diag']]
print (df)
  Name  Diag
0    A     1
1    A     1
Run Code Online (Sandbox Code Playgroud)

编辑:

meandatetimes并不容易-需要将日期转换为nanoseconds,获取均值并最后转换为datetimes。另外还有另一个问题-需要替换NaN一些标量,例如0转换为0datetime的内容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
Run Code Online (Sandbox Code Playgroud)