熊猫' pivot_table正在删除NaT日期

时间:2018-05-04 08:21:30

标签: pandas datetime

我在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和未知日期的信息?

1 个答案:

答案 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