如何根据最近的行日期复制 DataFrame 中的行

Posted

技术标签:

【中文标题】如何根据最近的行日期复制 DataFrame 中的行【英文标题】:How to duplicate rows on DataFrame based on most recent row date 【发布时间】:2021-10-10 17:59:17 【问题描述】:

我的数据如下所示:

Report Date Location Data
8/6/2021 St. Louis 100
8/1/2021 St. Louis 89
7/29/2021 St. Louis 85
7/24/2021 St. Louis 80
7/30/2021 Louisville 92
7/25/2021 Louisville 79

但是当我使用内置的animation_groupsanimation_framesplotly 中绘制数据时,滑块会自然地从一行跳到另一行,这在每次“跳跃”时都不会产生直观的动画天数不同。

我正在尝试解决并做的是创建一个新表,该表复制行并保留真实的报告数据,但创建一个额外的“动画日期”以保持滑块过渡直观。我希望新的数据表如下所示。假设代码运行的日期是 2021 年 8 月 6 日。

Report Date Animation Date Location Data Days Since Most Recent Report
8/6/2021 8/6/2021 St. Louis 100 0
8/1/2021 8/5/2021 St. Louis 89 4
8/1/2021 8/4/2021 St. Louis 89 3
8/1/2021 8/3/2021 St. Louis 89 2
8/1/2021 8/2/2021 St. Louis 89 1
8/1/2021 8/1/2021 St. Louis 89 0
7/29/2021 7/30/2021 St. Louis 85 1
7/29/2021 7/29/2021 St. Louis 85 0
7/24/2021 7/28/2021 St. Louis 80 4
7/24/2021 7/27/2021 St. Louis 80 3
7/24/2021 7/26/2021 St. Louis 80 2
7/24/2021 7/25/2021 St. Louis 80 1
7/24/2021 7/24/2021 St. Louis 80 0
7/30/2021 8/6/2021 Louisville 92 7
7/30/2021 8/5/2021 Louisville 92 6
7/30/2021 8/4/2021 Louisville 92 5
7/30/2021 8/3/2021 Louisville 92 4
7/30/2021 8/2/2021 Louisville 92 3
7/30/2021 8/1/2021 Louisville 92 2
7/30/2021 7/31/2021 Louisville 92 1
7/30/2021 7/30/2021 Louisville 92 0
7/25/2021 7/29/2021 Louisville 79 4
7/25/2021 7/28/2021 Louisville 79 3
7/25/2021 7/27/2021 Louisville 79 2
7/25/2021 7/26/2021 Louisville 79 1
7/25/2021 7/25/2021 Louisville 79 0

通过这样做,动画可以显示“自最近报告以来的天数”或“报告日期”,以表明在动画播放时,显示的某些数据可能具有一定的古老性,但动画会适当地穿越时间并在那里是整个动画中显示的数据。每次“动画日期”与“报告日期”匹配时,都会为每个“动画日期”显示新的数据位,直到出现新的“报告日期”,并且循环重复自身直到动画达到现在。

如果有任何更简单的方法来解决这个问题,请告诉我!否则,在迭代旧 DataFrame 时,我很难在创建新 DataFrame 的逻辑上起步。

【问题讨论】:

【参考方案1】:

IIUC 你可以reindexpd.MultiIndex.from_tuples

df["Animation Date"] = pd.to_datetime(df["Report Date"])

max_date = df["Report Date"].max()

idx = pd.MultiIndex.from_tuples([[x, d] for x, y in df.groupby("Location")["Animation Date"]
                                 for d in pd.date_range(min(y), max_date)],
                                names=["Location", "Animation Date"])

s = df.set_index(["Location", "Animation Date"]).reindex(idx).reset_index()

s["Days Since"] = s.groupby(["Location", s.Data.notnull().cumsum()]).cumcount()

print (s.ffill())

      Location Animation Date Report Date   Data  Days Since
0   Louisville     2021-07-25   7/25/2021   79.0           0
1   Louisville     2021-07-26   7/25/2021   79.0           1
2   Louisville     2021-07-27   7/25/2021   79.0           2
3   Louisville     2021-07-28   7/25/2021   79.0           3
4   Louisville     2021-07-29   7/25/2021   79.0           4
5   Louisville     2021-07-30   7/30/2021   92.0           0
6   Louisville     2021-07-31   7/30/2021   92.0           1
7   Louisville     2021-08-01   7/30/2021   92.0           2
8   Louisville     2021-08-02   7/30/2021   92.0           3
9   Louisville     2021-08-03   7/30/2021   92.0           4
10  Louisville     2021-08-04   7/30/2021   92.0           5
11  Louisville     2021-08-05   7/30/2021   92.0           6
12  Louisville     2021-08-06   7/30/2021   92.0           7
13   St. Louis     2021-07-24   7/24/2021   80.0           0
14   St. Louis     2021-07-25   7/24/2021   80.0           1
15   St. Louis     2021-07-26   7/24/2021   80.0           2
16   St. Louis     2021-07-27   7/24/2021   80.0           3
17   St. Louis     2021-07-28   7/24/2021   80.0           4
18   St. Louis     2021-07-29   7/29/2021   85.0           0
19   St. Louis     2021-07-30   7/29/2021   85.0           1
20   St. Louis     2021-07-31   7/29/2021   85.0           2
21   St. Louis     2021-08-01    8/1/2021   89.0           0
22   St. Louis     2021-08-02    8/1/2021   89.0           1
23   St. Louis     2021-08-03    8/1/2021   89.0           2
24   St. Louis     2021-08-04    8/1/2021   89.0           3
25   St. Louis     2021-08-05    8/1/2021   89.0           4
26   St. Louis     2021-08-06    8/6/2021  100.0           0

【讨论】:

以上是关于如何根据最近的行日期复制 DataFrame 中的行的主要内容,如果未能解决你的问题,请参考以下文章

如何将 DataFrame 中两列中的两个日期和时间合并为一列? [复制]

如何根据时间显示当前最近的行?

如何在 BigQuery 的开始日期和结束日期之间复制生成日期的行?

如何根据 Python Pandas 中的其他列在 DataFrame 中创建新列? [复制]

按最近的时间戳对 Spark DataFrame 中的行进行重复数据删除

根据最近的日期从多个相似的行中选择一行