如何根据最近的行日期复制 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_groups
和animation_frames
在plotly
中绘制数据时,滑块会自然地从一行跳到另一行,这在每次“跳跃”时都不会产生直观的动画天数不同。
我正在尝试解决并做的是创建一个新表,该表复制行并保留真实的报告数据,但创建一个额外的“动画日期”以保持滑块过渡直观。我希望新的数据表如下所示。假设代码运行的日期是 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 你可以reindex
到pd.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 中创建新列? [复制]