首页 > 解决方案 > Pandas 的 pivot_table 正在删除 NaT 日期

问题描述

在熊猫中创建数据透视表时遇到问题。这里的问题是日期时间字段中的 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

当我创建一个将日期和名称作为索引的值相加的数据透视表时,我在日期列中没有任何对应于 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 和未知日期的信息?

标签: pandasdatetime

解决方案


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

推荐阅读