pandas - 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 和未知日期的信息?
解决方案
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
推荐阅读
- c# - 如何让 QnA maker 和 Luis BOT 的集成能够准确工作?
- r - 语言 R:变量在“for()”循环内不会改变?
- php - 如何从当前父类别中获取 Woocommerce 所有子类别
- reactjs - 当代码在服务器上时,从客户端或服务器端完成 React JS API 调用。?
- assembly - 试图将参数传递给过程但引发异常?
- node.js - 具有存储库的 Amazon AWS Lambda 函数......?
- php - 根据 WooCommerce 中的购物车项目总数隐藏所有运输方式
- robotframework - 机器人框架的 WebDriverException 错误
- php - 如何从两列中获取唯一的值列表?
- java - 如何使 SVG 在 Android 中可点击?