python - 如何在熊猫中创建事件的二维数据框网格
问题描述
我有一个包含如下数据的 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。
任何帮助是极大的赞赏
解决方案
创建一个包含我们需要的所有数据的数据框。诀窍是将单词“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
推荐阅读
- dotconnect - 升级到 EF Core 2.2 => 3.1 后,DbSet.Add() 不再生成 Guid ID
- windows - 带有或不带有 INF 文件的 Windows 驱动程序
- javascript - Discord.js 版本 12 我无法禁止用户
- python - 比较后将一个 csv 中的数据附加到另一个 csv 的 Python 脚本
- react-native - DrawerNavigator 在打开时重定向到第一条路线
- angular - 如何在 Angular 的规范测试文件中禁用 strictNullChecks?
- batch-file - 如何使用带有 robocopy 命令的时间戳创建带有日期和时间的文件夹
- java - JsonPropertyOrder 不适用于 javax rs 响应
- python - 添加时间间隔并获取当时存在的对象的计数
- java - Spring 多对多关联 DTO 转换