重新索引枢轴 table 以添加缺失的日期和时间
Reindex pivot table to add missing days and times
我尝试使用 pandas 数据透视表从活动日志中制作热图。要添加缺失的时间和日期,我使用了重新索引功能,但我无法按列重新索引。
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
欢迎来到 Whosebug。
您这里的索引是一个MultiIndex,第一级是“日期”。 Pandas 认为您正在尝试更改索引的这一部分,这不起作用,因为它是一个字符串。 (我想。不确定。)
如果您使用 droplevel() 删除索引的第一级,您将拥有一个常规整数索引,并且它会起作用。结果我也得到了 NaN,所以我也添加了一个 fillna() 调用。
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.columns = hm.columns.droplevel(0)
hm = hm.reindex(range(0,24), axis='columns', fill_value=0)
hm = hm.fillna(0)
我得到以下情节。
您得到的输出是一个 MultiIndex 列索引(第一级是“日期”,第二级是小时)。发生这种情况的原因是因为您没有为 pivot_table
的调用提供 values
参数
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
我尝试使用 pandas 数据透视表从活动日志中制作热图。要添加缺失的时间和日期,我使用了重新索引功能,但我无法按列重新索引。
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
欢迎来到 Whosebug。
您这里的索引是一个MultiIndex,第一级是“日期”。 Pandas 认为您正在尝试更改索引的这一部分,这不起作用,因为它是一个字符串。 (我想。不确定。)
如果您使用 droplevel() 删除索引的第一级,您将拥有一个常规整数索引,并且它会起作用。结果我也得到了 NaN,所以我也添加了一个 fillna() 调用。
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.columns = hm.columns.droplevel(0)
hm = hm.reindex(range(0,24), axis='columns', fill_value=0)
hm = hm.fillna(0)
我得到以下情节。
您得到的输出是一个 MultiIndex 列索引(第一级是“日期”,第二级是小时)。发生这种情况的原因是因为您没有为 pivot_table
values
参数
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