微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重新索引数据透视表以添加缺少的日期和时间

如何解决重新索引数据透视表以添加缺少的日期和时间

我尝试使用熊猫数据透视表从活动日志中制作热图。要添加缺少的时间和日期,我使用了reindex函数,但无法按列重新索引。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'Date':['2015-11-10 18:39:00','2015-11-14 11:30:00','2015-11-14 13:48:00','2015-11-15 16:06:00','2015-11-16 21:08:00','2020-08-31 18:06:00','2020-09-18 11:17:00','2020-09-19 15:41:00','2020-09-25 16:28:00','2020-09-25 19:45:00']})
df['Date'] = pd.to_datetime(df['Date'])

    
hm = df.pivot_table(columns=df['Date'].dt.hour,index=df['Date'].dt.day_name(),aggfunc='count',fill_value=0,dropna=False)
hm = hm.reindex(['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'],axis='index')
hm = hm.reindex(range(0,24),axis='columns',fill_value=0)

figg,ax2 = plt.subplots(figsize=(20,3))
im = ax2.imshow(hm)

我收到以下错误消息

ValueError: Buffer dtype mismatch,expected 'Python object' but got 'long'

预期输出应为

           0   1   2   3   4   5   6   7   8   9       20  21  22  23
Monday     0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   
Tuesday    0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0  
Wednesday  0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0  
Thursday   0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0  
Friday     0   0   0   0   0   0   0   0   0   0  ...   0   0   1   0   
Saturday   0   0   0   0   0   0   0   0   0   0  ...   0   1   0   0   
Sunday     0   0   0   0   0   0   0   0   0   0  ...   0   0   1   0   

解决方法

您得到的输出是MultiIndex列索引(第一级是“日期”,第二级是小时)。发生这种情况的原因是因为您没有为调用values

提供pivot_table参数
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'Date':['2015-11-10 18:39:00','2015-11-14 11:30:00','2015-11-14 13:48:00','2015-11-15 16:06:00','2015-11-16 21:08:00','2020-08-31 18:06:00','2020-09-18 11:17:00','2020-09-19 15:41:00','2020-09-25 16:28:00','2020-09-25 19:45:00']})
df['Date'] = pd.to_datetime(df['Date'])

# Note the addition of the `values` argument
hm = df.pivot_table(columns=df['Date'].dt.hour,index=df['Date'].dt.day_name(),values="Date",aggfunc='count',fill_value=0,dropna=False)

# you can also reindex both the index and columns in 1 call
hm = hm.reindex(
    index=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'],columns=range(24),fill_value=0
)

print(hm)
Date       0   1   2   3   4   5   6   7   8   9   ...  14  15  16  17  18  19  20  21  22  23
Date                                               ...                                        
Monday      0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   1   0   0   1   0   0
Tuesday     0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   1   0   0   0   0   0
Wednesday   0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   0   0   0   0
Thursday    0   0   0   0   0   0   0   0   0   0  ...   0   0   0   0   0   0   0   0   0   0
Friday      0   0   0   0   0   0   0   0   0   0  ...   0   0   1   0   0   1   0   0   0   0
Saturday    0   0   0   0   0   0   0   0   0   0  ...   0   1   0   0   0   0   0   0   0   0
Sunday      0   0   0   0   0   0   0   0   0   0  ...   0   0   1   0   0   0   0   0   0   0
,

欢迎使用StackOverflow。

您的索引在这里是一个MultiIndex,第一级是“日期”。 Pandas认为您正在尝试更改索引的这一部分,该部分不起作用,因为它是一个字符串。 (我想。对此不确定。)

如果使用droplevel()删除索引的第一级,则将有一个常规的整数索引,它将可以使用。我还以NaNs结尾,所以我也添加了fillna()调用。

hm = df.pivot_table(columns=df['Date'].dt.hour,dropna=False)
hm = hm.reindex(['Monday',axis='index')
hm.columns = hm.columns.droplevel(0)
hm = hm.reindex(range(0,24),axis='columns',fill_value=0)
hm = hm.fillna(0)

我得到以下图。

rendered plot

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。