首页 > 解决方案 > 如何在熊猫中创建事件的二维数据框网格

问题描述

我有一个包含如下数据的 DF:

标识符 日期 地位
ID1 2021-05-02 19:55:43 好的
ID2 2021-05-02 19:48:01 失败的
ID3 2021-05-02 19:47:53 好的
ID1 2021-05-03 19:55:43 失败的
ID2 2021-05-03 20:48:01 好的
ID3 2021-05-03 19:47:53 好的
ID1 2021-05-04 19:55:43 失败的
ID2 2021-05-04 19:48:01 好的
ID3 2021-05-04 19:47:53 好的

这些行实际上是数千行,ID 是数百,但这不相关。假设它们是每个 ID 每天 1 个事件(行)。我希望能够只返回 X 天 - 例如过去 3 天,并创建以天数作为 X 轴、ID 作为 Y 轴的网格。单元格连续几天没有成功:

X 3 2 1
ID1 0 1 2
ID2 1 0 0
ID3 0 0 0

3天前的ID1为0,因为当天有成功。但是同一个 ID 之后有 2 次失败,因此第 1 天(最近一天)在该 ID 的单元格中是 2。

这个想法是让 Dataframe 为稍后阶段的某种热图可视化做好准备,但即使在彩色 xlsx 中也有视觉感 - 缺乏成功的情况更为严重,而哪里还可以

如果我们想象历史更长的 ID4:

OK,FAIL,OK,OK,FAIL,FAIL,OK,FAIL,FAIL,FAIL,OK

该行应该看起来像

0,1,0,0,1,2,0,1,2,3,0

这就像一个连续失败的计数器,每次 OK 都会重置为 0。

任何帮助是极大的赞赏

标签: pythonpandasdataframe

解决方案


创建一个包含我们需要的所有数据的数据框。诀窍是将单词“FAILED”和“OK”分别替换为 1 和 NaN。当您进行累积和时,NaN 将被忽略。

df1 = pd.DataFrame({"Identificator": df["Identificator"],
                    "Days": df.groupby(["Identificator"]).cumcount(ascending=False)+1,
                    "Status": df["Status"].replace({"FAILED": 1, "OK": np.NaN})})
>>> df1
  Identificator  Days  Status
0           ID1     3     NaN
1           ID2     3     1.0
2           ID3     3     NaN
3           ID1     2     1.0
4           ID2     2     NaN
5           ID3     2     NaN
6           ID1     1     1.0
7           ID2     1     NaN
8           ID3     1     NaN
df1 = df1.pivot(index="Identificator", columns="Days", values="Status") \
         .iloc[:, ::-1] \
         .cumsum(axis="columns") \
         .fillna(0) \
         .astype(int) \
         .rename_axis(index=None, columns=None)

# .iloc[:, ::-1] to reverse order of columns
# cumsum only on FAILED (NaN is ignored)
# set 0 for OK (NaN)
>>> df1
     3  2  1
ID1  0  1  2
ID2  1  0  0
ID3  0  0  0

推荐阅读