当前位置: 首页 > 面试题库 >

填补MultiIndex Pandas Dataframe中的日期空白

璩和璧
2023-03-14
问题内容

我想修改一个熊猫MultiIndex
DataFrame,以使每个索引组都包括指定范围之间的日期。我希望每个小组使用值0(或NaN)填写缺少的日期2013-06-11至2013-12-31


Group A, Group B, Date,           Value
loc_a    group_a  2013-06-11      22
                  2013-07-02      35
                  2013-07-09      14
                  2013-07-30       9
                  2013-08-06       4
                  2013-09-03      40
                  2013-10-01      18
         group_b  2013-07-09       4
                  2013-08-06       2
                  2013-09-03       5
         group_c  2013-07-09       1
                  2013-09-03       2
loc_b    group_a  2013-10-01       3

我已经看到了有关reindexing的一些讨论,但这是针对简单(非分组)时间序列数据的。

是否有捷径可寻?

以下是我为实现此目的所做的一些尝试。例如:通过堆叠后['A', 'B'],我便可以重新索引。

df = pd.DataFrame({'A': ['loc_a'] * 12 + ['loc_b'],
                'B': ['group_a'] * 7 + ['group_b'] * 3 + ['group_c'] * 2 + ['group_a'],
                'Date': ["2013-06-11",
                        "2013-07-02",
                        "2013-07-09",
                        "2013-07-30",
                        "2013-08-06",
                        "2013-09-03",
                        "2013-10-01",
                        "2013-07-09",
                        "2013-08-06",
                        "2013-09-03",
                        "2013-07-09",
                        "2013-09-03",
                        "2013-10-01"],
                 'Value': [22, 35, 14,  9,  4, 40, 18, 4, 2, 5, 1, 2, 3]})

df.Date = df['Date'].apply(lambda x: pd.to_datetime(x).date())
df = df.set_index(['A', 'B', 'Date'])

dt_start = dt.datetime(2013,6,1)
all_dates = [(dt_start + dt.timedelta(days=x)).date() for x in range(0,60)]

df2 = df.unstack(['A', 'B'])
df3 = df2.reindex(index=all_dates).fillna(0)
df4 = df3.stack(['A', 'B'])

## df4 is about where I want to get, now I'm trying to get it back in the form of df...

df5 = df4.reset_index()
df6 = df5.rename(columns={'level_0' : 'Date'})
df7 = df6.groupby(['A', 'B', 'Date'])['Value'].sum()

最后几行让我有些难过。我希望df6我可以简单地set_index回到['A', 'B', 'Date'],但是不会将值分组,因为它们在初始dfDataFrame中分组了。

关于如何重新索引未堆叠的DataFrame,重新堆叠以及使DataFrame与原始格式相同的任何想法?


问题答案:

您不清楚确切的失踪日期。我只是假设您要填写NaN在其他地方 确实 有观察到的任何日期。如果此假设有误,则必须修改我的解决方案。

旁注:添加一行以创建 DataFrame

In [55]: df = pd.DataFrame({'A': ['loc_a'] * 12 + ['loc_b'],
   ....:                    'B': ['group_a'] * 7 + ['group_b'] * 3 + ['group_c'] * 2 + ['group_a'],
   ....:                    'Date': ["2013-06-11",
   ....:                            "2013-07-02",
   ....:                            "2013-07-09",
   ....:                            "2013-07-30",
   ....:                            "2013-08-06",
   ....:                            "2013-09-03",
   ....:                            "2013-10-01",
   ....:                            "2013-07-09",
   ....:                            "2013-08-06",
   ....:                            "2013-09-03",
   ....:                            "2013-07-09",
   ....:                            "2013-09-03",
   ....:                            "2013-10-01"],
   ....:                     'Value': [22, 35, 14,  9,  4, 40, 18, 4, 2, 5, 1, 2, 3]})

In [56]:

In [56]: df.Date = pd.to_datetime(df.Date)

In [57]: df = df.set_index(['A', 'B', 'Date'])

In [58]:

In [58]: print(df)
                          Value
A     B       Date             
loc_a group_a 2013-06-11     22
              2013-07-02     35
              2013-07-09     14
              2013-07-30      9
              2013-08-06      4
              2013-09-03     40
              2013-10-01     18
      group_b 2013-07-09      4
              2013-08-06      2
              2013-09-03      5
      group_c 2013-07-09      1
              2013-09-03      2
loc_b group_a 2013-10-01      3

要填充未观察到的值,我们将使用unstackstack方法。取消堆叠将创建NaN我们感兴趣的s,然后将它们堆叠起来使用。

In [71]: df.unstack(['A', 'B'])
Out[71]: 
              Value                           
A             loc_a                      loc_b
B           group_a  group_b  group_c  group_a
Date                                          
2013-06-11       22      NaN      NaN      NaN
2013-07-02       35      NaN      NaN      NaN
2013-07-09       14        4        1      NaN
2013-07-30        9      NaN      NaN      NaN
2013-08-06        4        2      NaN      NaN
2013-09-03       40        5        2      NaN
2013-10-01       18      NaN      NaN        3


In [59]: df.unstack(['A', 'B']).fillna(0).stack(['A', 'B'])
Out[59]: 
                          Value
Date       A     B             
2013-06-11 loc_a group_a     22
                 group_b      0
                 group_c      0
           loc_b group_a      0
2013-07-02 loc_a group_a     35
                 group_b      0
                 group_c      0
           loc_b group_a      0
2013-07-09 loc_a group_a     14
                 group_b      4
                 group_c      1
           loc_b group_a      0
2013-07-30 loc_a group_a      9
                 group_b      0
                 group_c      0
           loc_b group_a      0
2013-08-06 loc_a group_a      4
                 group_b      2
                 group_c      0
           loc_b group_a      0
2013-09-03 loc_a group_a     40
                 group_b      5
                 group_c      2
           loc_b group_a      0
2013-10-01 loc_a group_a     18
                 group_b      0
                 group_c      0
           loc_b group_a      3

根据需要重新排列索引级别。

我必须将其滑到fillna(0)中间,以免NaNs掉落。
stack确实有一个dropna论点。我认为将其设置为false将保留所有NaN行。可能是个错误?



 类似资料:
  • 问题内容: 我有一个带有IDENTITY列的表 在添加/删除了beeing的某些行之后,我以Id值的间隔结尾: 有没有一种简单的方法可以将值压缩为 ? 问题答案: 我认为用相同的模式创建第二张表,从第一张表导入所有数据(当然,除了identity列;让第二张表开始重新编号),然后删除第一张表并将第二张表重命名为原始名称。 如果您有大量的FK关系要与其他表等一起重建,是否容易成为问题。

  • 问题内容: 我发现了一个类似的问题(重复记录以填补Google BigQuery中日期之间的空白 ),但是存在不同的情况,答案不适用。 我的数据结构如下(基本上是多个产品和合作伙伴的价格变动历史记录): 我需要的是一个查询(特别是用BigQuery Standard SQL编写),该查询在给定日期范围(在这种情况下为)下输出以下结果: 对于产品和合作伙伴的每种组合,基本上都是价格历史记录,其中包含

  • 问题内容: 假设我有两条记录,都有日期和计数: 您将如何选择此项以填补时间空白,并始终保持最近的记录? 因此输出将是: 我还没有找到一个整齐的解决方案。我想可以使用DATEDIFF和for循环来完成此操作,但我希望可以更轻松地完成此操作。 问题答案: 您有2个要解决的问题。第一个问题是如何填补空白。第二个问题是为那些缺少的记录填充“计数”字段。 问题1:这可以通过使用或创建一个来解决。如果可以的话

  • 问题内容: 我有这个查询: 两个星期前在哪里,今天是今天。 我正在尝试查找特定日期范围内每天的所有点击。我也想包括没有点击的日子。由于我的数据库中自然没有这些条目,因此我需要向他们包括一些方法,如何最好地做到这一点,同时显示从开始日期到结束日期的所有日期。这是我目前所拥有的,这两个星期的日期范围有很多差距。 可以通过纯SQL查询完成此操作,还是必须使用某些php逻辑? 顺便说一句,为什么我有第一次

  • 问题内容: 我有两张表。 带有客户和日期的订单表。数据仓库中的日期维度表。 订单表并不包含给定月份中每个日期的活动,但是我需要返回一个填充日期和客户缺口的结果集。 例如,我需要这个: 看起来像这样: 这似乎是一个左外部联接,但它没有返回预期的结果。这是我正在使用的内容,但这并没有按预期返回日期表中的每个日期。 问题答案: 问题是您需要所有日期的所有客户。当您执行时,customer字段将为NULL

  • 问题内容: 我有一个收藏。 产品浏览 我有一个查询,用于获取特定产品的每日视图。 询问 当前结果 问题 问题是,这种聚合不会在有视图的几天内返回。这会导致数据显示不正确: 结果应该看起来像 PS:最好输入开始和结束日期以基于此范围输出结果 问题答案: 您需要几个额外的步骤来返回默认值。首先,你需要使用与设置为收集所有结果中的一个文件内。然后,您可以将$ map 与一组天作为输入。在其中,您可以使用