使用较小的

时间:2018-04-19 11:47:53

标签: python pandas

大熊猫相当新,所以我正在努力解决这个问题。

我有一个更大的DataFrame,其记录由包含DatetimeIndex的MultiIndex索引,以及一个较小的DataFrame索引,包含开始日期和结束日期,两者都是DatetimeIndex。这是他们的样子:

更大的DataFrame:

                       Data
PatId EntryDate  Id                                        
725   2005-01-03 1422  X
      2005-01-04 1563  X
      2005-01-05 1355  X
      2005-01-06 118   X
      2005-01-09 1400  X

包含日期范围的小一个:

                         PatId
EntryDate  ExitDate          
2005-01-15 2005-04-15   22407
2005-01-30 2005-04-30   95938
2005-02-07 2005-05-07  116812
2005-02-18 2005-05-18   12163
2005-02-21 2005-05-21   22908

我想要一种优雅而有效的方法来过滤较大的DataFrame,只包含那些属于较小DataFrame中定义的日期范围的记录。

2 个答案:

答案 0 :(得分:1)

你可以这样做一个简单的过程:

pd.concat([df.loc[:, start:end] for start, end in zip(df2.EntryDate, df2.ExitDate)])

<强>解释

  • DataFrames允许使用datetime或可解析为datetime的字符串格式进行切片
  • 您需要将数据帧过滤为较小的部分,然后将其连接起来
  • 其余的只是简单列表理解

答案 1 :(得分:1)

您可以使用:

EntryDate = df2.index.get_level_values('EntryDate')
ExitDate = df2.index.get_level_values('ExitDate')

idx = np.concatenate([pd.date_range(s, e) for s, e in zip(EntryDate, ExitDate)])
df = df1[df1.index.get_level_values('EntryDate').isin(np.unique(idx))]

<强>解释

  1. 首先通过get_level_values
  2. 获取MultiIndex的值
  3. 循环创建date_range并加入
  4. 最后按isin过滤boolean indexing只有unique日期