首页 > 解决方案 > 熊猫数据帧中的长度不匹配与特定日期重新采样

问题描述

我已经为自己的数据尝试了代码。当我计算总和时它起作用。但是,如果我将索引分配给新的数据框,则会发生错误。我注意到这是因为有时我dfcustom_dates. 我仍然想将custom_datesas 索引分配给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_datesas 索引分配给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()但它适用于这个例子? 我在这里错过了什么吗?有什么建议/意见吗?谢谢!

标签: pythonpandas

解决方案


在这种情况下,错误是说 中只有 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 对象-尽管如果我在该假设上错了,有人会纠正我。


推荐阅读