【问题标题】:pandas pivot table for heatmap用于热图的 pandas 数据透视表
【发布时间】:2017-09-01 11:36:00
【问题描述】:

我正在尝试使用 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 中),在一个轴上针对Diag 显示Name - 如果发生。我尝试使用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:没有要聚合的数字类型

【问题讨论】:

  • 这个问题可以极大地受益于一些代码,这些代码显示了您实际尝试使用的枢轴语法。只显示错误让我们任何阅读它的人都不得不猜测很多。

标签: python pandas seaborn


【解决方案1】:

你需要 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 的日期时间并不容易 - 需要将日期转换为 nanoseconds,获取均值和最后转换为日期时间。还有另一个问题 - 需要将 NaN 替换为一些标量,例如0 转换为 0 日期时间的内容 - 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

【讨论】:

  • 谢谢!这很有帮助。现在的问题可能是时间实际上是数据时间格式,所以不是数字。也许我应该只添加一列作为解决方法?
  • 我认为这是同样的问题。但我知道如何检查这些值,请稍等。
  • pandas.core.base.DataError: No numeric types to aggregate 是我当前的错误。不幸的是,我没有在“2016-12-12”形式的时间示例中输入正确的数据类型
  • 好的,没问题。主要问题是 - 你需要意思吗?
  • 还是只有第一个值?
猜你喜欢
  • 2018-09-24
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2016-07-08
  • 2014-04-27
  • 2019-09-30
  • 2021-01-17
相关资源
最近更新 更多