我在pandas中创建数据透视表时遇到问题。这里的问题是datetime字段中的NaT值。我们假设我有一个这样的数据集:
import pandas as pd
import numpy as np
values = [5,2,1,3,4,5,6,7,5,10]
names = ['Name1'] * 3 + ['Name2'] * 3 + ['Name3'] * 4
dates = pd.DataFrame({'year': [2015, 2015] * 5,
'month': [2, 3] * 5,
'day': [4, 5] * 5})
dates_dt = pd.to_datetime(dates)
dates_dt.loc[1] = pd.NaT
df = pd.DataFrame({'Name': names, 'Date': dates_dt, 'Values': values})
df
看起来像这样:
Date Name Values
0 2015-02-04 Name1 5
1 NaT Name1 2
2 2015-02-04 Name1 1
3 2015-03-05 Name2 3
4 2015-02-04 Name2 4
5 2015-03-05 Name2 5
6 2015-02-04 Name3 6
7 2015-03-05 Name3 7
8 2015-02-04 Name3 5
9 2015-03-05 Name3 10
当我创建一个pivot_table,它将值与日期和名称相加作为索引时,我不会在日期列中有任何与Name1和NaT相对应的行:
pd.pivot_table(
df,
values='Values',
index=['Name', 'Date'],
aggfunc=np.sum,
fill_value=0
).reset_index()
产生的数据透视表:
Name Date Values
0 Name1 2015-02-04 6
1 Name2 2015-02-04 4
2 Name2 2015-03-05 8
3 Name3 2015-02-04 11
4 Name3 2015-03-05 17
是否有任何优雅的方式(而不是将日期转换为字符串)可以帮助我不丢失有关Name1和未知日期的信息?
答案 0 :(得分:0)
fill_value
是替换values
列中缺失值的值,而不是index
中的值。我不知道你的问题的干净解决方案,但这里有一个hacky - 你可以暂时用一些时间戳替换NaT
s,你确定,在数据集中没有遇到:
df = df.replace(pd.NaT, pd.Timestamp(0))
(pd.pivot_table(
df,
values='Values',
index=['Name', 'Date'],
aggfunc=np.sum)
.reset_index()
.replace(pd.Timestamp(0), pd.NaT))
# Name Date Values
# 0 Name1 NaT 2
# 1 Name1 2015-02-04 6
# 2 Name2 2015-02-04 4
# 3 Name2 2015-03-05 8
# 4 Name3 2015-02-04 11
# 5 Name3 2015-03-05 17