如何根据条件在多索引数据框中添加缺少的日期行

时间:2019-10-30 06:17:33

标签: python pandas multi-index

我大约有750万行数据,格式如下:

ndc_description               effective_date        ...                             
12-HR DECONGEST 120MG CAPLET  2015-08-19            2015-08-26          G   NaN     NaN     1   0.36062     36800005452     Y   C/I     EA
                              2015-07-22            2015-08-12          G   NaN     NaN     1   0.37681     36800005452     Y   C/I     EA
                              2015-06-17            2015-07-15          G   NaN     NaN     1   0.36651     36800005452     Y   C/I     EA
Some Other drug               2016-11-21            2015-08-26          G   NaN     NaN     1   0.36062     36800005452     Y   C/I     EA
                              2016-07-23            2015-08-12          G   NaN     NaN     1   0.37681     36800005452     Y   C/I     EA
                              2016-05-17            2015-07-15          G   NaN     NaN     1   0.36651     36800005452     Y   C/I     EA

ndc_description和有效日期为多索引。

我还有一个其他数据集,正在与上面合并。它们将被ndc_description列和Effective_date列合并(显示的其他列纯粹是为了演示数据集中是否存在其他类型的数据)。

当前问题:每个数据集中的日期都不匹配。在上面的数据集中,它们(大部分)是每周一次,但这不能保证。在其他数据集中,也没有保证的规律性。因此,我想我需要为上面的valid_date列中列出的日期之间的所有日期添加行,以便随后可以对ndc_description和Effective_date进行合并。 这是执行此过程的最佳方法吗?由于涉及的数据量大,我想在最终运行所有数据之前优化所涉及的代码。

潜在的解决方案::我已经看到.resample()在这里可能很有价值,但是我还无法使其工作。像这样的东西:Cleaned_Price_Data.effective_date.resample('1D', fill_method = 'ffill', level = 1)

我认为将max&min日期包括在上面的某处也将提高效率,这样就不会ffill超出必要范围。另外,将值包括在ndc_description中,这样就不会为每个相同的ndc_description值重复添加到有效日期列的日期。

编辑: 这是一些代码,说明了数据框的当前状态以及转换完成后的外观。 我正在尝试转换这样的数据框:

idx = pd.MultiIndex.from_product([['drug_a', 'drug_b', 'drug_c'],
                                  ['2015-08-19', '2015-08-17', '2015-08-14']],
                                 names=['drug_name', 'effective_date'])
col = ['other_data_1', 'other_data_2', 'other_data_3']

pre_transform = pd.DataFrame('-', idx, col)
pre_transform

对于这样的人(请注意添加日期):

idx = pd.MultiIndex.from_product([['drug_a', 'drug_b', 'drug_c'],
                                  ['2015-08-19', '2015-08-18', '2015-08-17', '2015-08-16', '2015-08-15', '2015-08-14']],
                                 names=['drug_name', 'effective_date'])
col = ['other_data_1', 'other_data_2', 'other_data_3']

post_change = pd.DataFrame('-', idx, col)
post_change

编辑2:我想出了以下代码(通过Parfait的答案here),似乎可以解决问题:

def expand_dates(ser):
    return pd.DataFrame({'effective_date': pd.date_range(ser['effective_date'].min(), ser['effective_date'].max(), freq='D')})

price_cols = list(Cleaned_Price_Data.columns)

all_effective_dates = Cleaned_Price_Data.groupby(['ndc']).apply(expand_dates).reset_index().merge(Cleaned_Price_Data, how = 'left')[price_cols].ffill()

但是,在5500万行的文件中,文件非常膨胀,我将尝试将其与另一个数据集合并。任何对此进行优化(或建议使用更有效的替代方法)的尝试将不胜感激。

0 个答案:

没有答案