python - 熊猫数据帧中的长度不匹配与特定日期重新采样
问题描述
我已经为自己的数据尝试了代码。当我计算总和时它起作用。但是,如果我将索引分配给新的数据框,则会发生错误。我注意到这是因为有时我df
在custom_dates
. 我仍然想将custom_dates
as 索引分配给custom_sum
.
对原代码的小调整:
import pandas as pd
import numpy as np
import datetime
np.random.seed(100)
df = pd.DataFrame(np.random.randint(0,100,size=(10, 1)), columns=list('A'))
df.index = pd.DatetimeIndex([datetime.date(2016,1,1),
datetime.date(2016,1,5),
datetime.date(2016,2,1),
datetime.date(2016,2,2),
datetime.date(2016,2,5),
datetime.date(2016,2,7),
datetime.date(2016,2,21),
datetime.date(2016,2,28),
datetime.date(2016,2,29),
datetime.date(2016,3,1)
])
custom_dates = pd.DatetimeIndex([datetime.date(2016,1,1),
datetime.date(2016,2,8),
datetime.date(2016,2,10),
datetime.date(2016,3,1)
])
custom_sum = df.groupby(custom_dates[custom_dates.searchsorted(df.index)]).sum()
而这段代码
custom_dates.searchsorted(df.index)
给我
array([0, 1, 1, 1, 1, 1, 3, 3, 3, 3], dtype=int64)
这正是“我的 df 在 custom_dates 之间没有数据”,因为两者之间 df
没有数据datetime.date(2016,2,8)
datetime.date(2016,2,10)
现在,如果我将custom_dates
as 索引分配给custom_sum
.
custom_sum.index = custom_dates
发生以下错误:
ValueError: Length mismatch: Expected axis has 3 elements, new values have 4 elements
至于我自己的数据。我的custom_dates
礼物
dtype='datetime64[ns]', name='date_time', length=46899, freq=None
我的df.index
礼物
dtype='datetime64[ns]', name='time_index', length=6363585, freq=None
我希望 custom_sum 中的所有实际日期都可以通过
custom_sum = df.groupby(custom_dates[custom_dates.searchsorted(df.index)]).sum()
但是,代码:
df.groupby(custom_dates[custom_dates.searchsorted(df.index)]).sum()
给出错误
IndexError: index 46899 is out of bounds for axis 0 with size 46899
我只能做
custom_dates.searchsorted(df.index)
这使
array([ 0, 0, 0, ..., 46899, 46899, 46899], dtype=int64)
但没有实际日期。所以我的问题是为什么我应该得到一个错误df.groupby(custom_dates[custom_dates.searchsorted(df.index)]).sum()
但它适用于这个例子?
我在这里错过了什么吗?有什么建议/意见吗?谢谢!
解决方案
在这种情况下,错误是说 中只有 3 个项目custom_sum
,而custom_dates
列出了 4 个日期。删除错误的日期(datetime.date(2016,2,10)
在这种情况下)应该可以解决维度问题。
但一般来说,要保存仅包含满足特定条件的行的新 DataFrame,您可以使用:
new_df = custom_sum[custom_sum.index.isin(custom_dates)]
也有办法做到这DataFrame.drop()
一点。不确定哪个更有效或更理想。但是我怀疑使用该参数df.drop()
并使用该inplace=True
参数可能会节省内存,因为它不会创建新的 DataFrame 对象-尽管如果我在该假设上错了,有人会纠正我。
推荐阅读
- ios - Swift:枚举编码如何获取原始值
- android - 使用 Shortcut android 共享意图选项
- python-3.x - Pygame淡入黑功能
- python-3.x - Unabel在python中创建子文件夹
- python - 从不等长度的字符串创建数据框
- javascript - 在 cytoscape.js 中显示选定的节点
- .net-core - 如何在 EFCore 中更改表达式 DateTime
- wso2 - WSO2 ESB 无法使用克隆中介将消息从 ESB 发送出去
- javascript - Express 根路由在生产中不起作用
- android - 带有交错布局的 Android CardView