Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于热图的数据透视表_Python_Pandas_Seaborn - Fatal编程技术网

Python 用于热图的数据透视表

Python 用于热图的数据透视表,python,pandas,seaborn,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

我正在尝试使用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:索引包含重复的条目,无法重塑

这来自:

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

时间是不相关的,但我想展示一下哪些
名称
拥有哪些
Diag
,哪些
Diag
组合聚集在一起。我是否需要为此创建一个新表,或者是否可能为此创建一个新表?在某些情况下,
Name
与所有
Diag

编辑: 此后,我尝试: piv=df.pivot_表(index='Name',columns='Diag',values='Time',aggfunc='mean')

然而,由于时间是datetime格式的,因此我的结论是:

pandas.core.base.DataError:没有要聚合的数值类型

您需要使用一些聚合函数,因为对于同一索引和列,有多个值,并且
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
编辑:

您还可以通过以下方式检查所有副本:

编辑:

日期时间的
平均值
不容易-需要将日期转换为
纳秒
,获取平均值和最后一次转换为日期时间。还有另一个问题-需要将
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
您需要使用一些聚合函数,因为对于同一索引和列,有多个值,
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
编辑:

您还可以通过以下方式检查所有副本:

编辑:

日期时间的
平均值
不容易-需要将日期转换为
纳秒
,获取平均值和最后一次转换为日期时间。还有另一个问题-需要将
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

谢谢这很有帮助。现在的问题可能是时间实际上是数据时间格式,所以不是数字。也许我应该添加一个关于这些问题的专栏作为解决方法?我认为这是同样的问题。但我知道如何检查这些值,请给我一个sec.pandas.core.base.DataError:没有要聚合的数字类型是我当前的错误。不幸的是,我没有在示例中输入正确的数据类型,因为它的时间格式是“2016-12-12”。好的,没问题。主要问题是-你需要平均值吗?还是只需要第一个值?谢谢!这很有帮助。现在的问题可能是时间实际上是数据时间格式,所以不是数字。也许我应该添加一个关于这些问题的专栏作为解决方法?我认为这是同样的问题。但我知道如何检查这些值,请给我一个sec.pandas.core.base.DataError:没有要聚合的数字类型是我当前的错误。不幸的是,我没有在示例中输入正确的数据类型,因为它的时间格式是“2016-12-12”。好的,没问题。主要问题是-您需要mean吗?还是只需要第一个值?这个问题可以从一些代码中受益匪浅,这些代码显示了您实际尝试的pivot语法。只显示错误会让我们任何阅读它的人都不得不猜测很多。如果有一些代码显示您实际尝试的pivot语法,这个问题可能会大大受益。仅仅显示错误就让我们阅读它的人不得不猜测很多。