gpt4 book ai didi

python - 在 pandas 中创建一个包含自上次事件以来的时间的新列

转载 作者:太空宇宙 更新时间:2023-11-04 09:45:42 25 4
gpt4 key购买 nike

我有一个具有以下结构的 Pandas 数据框:

ID    date           event_1   event_2 
1 2016-01-03 False False
2016-02-07 True False
2016-02-18 False True
2 2016-01-01 False True
2016-01-04 False False
2016-02-02 True False
2016-02-04 False False
2016-02-05 False True

IDdate 是一个 MultiIndex

问题是,我想创建两个新列 time_1time_2。这些列应显示自相应事件以来耗时,例如

ID    date           event_1     event_2   time_1    time_2
1 2016-01-03 False False - -
2016-02-07 True False 0 -
2016-02-18 False True 11 0
2 2016-01-01 False True - 0
2016-01-04 False False - 3
2016-02-02 True False 0 32
2016-02-04 False False 2 34
2016-02-05 False True 3 0

如果日期是一个索引,我如何在 pandas 中创建一个计算这个的函数?

计算是按ID 进行的,事件是不相关的。

最佳答案

如果您重置索引使 ID 和日期成为列(只是为了更容易引用它们——df.index.get_level_values("date") 有点笨拙)并且您确保df["date"] 是一个真正的日期时间列而不是字符串,我认为它非常简单:

df["time_1"] = df["date"] - df["date"].where(df["event_1"]).groupby(df["ID"]).ffill()
df["time_2"] = df["date"] - df["date"].where(df["event_2"]).groupby(df["ID"]).ffill()

给我

In [173]: df
Out[173]:
ID date event_1 event_2 time_1 time_2
0 1 2016-01-03 False False NaT NaT
1 1 2016-02-07 True False 0 days NaT
2 1 2016-02-18 False True 11 days 0 days
3 2 2016-01-01 False True NaT 0 days
4 2 2016-01-04 False False NaT 3 days
5 2 2016-02-02 True False 0 days 32 days
6 2 2016-02-04 False False 2 days 34 days
7 2 2016-02-05 False True 3 days 0 days

之所以可行,是因为(使用 event_2 因为它更有趣,因为它有两个不同的 True)首先我们只选择“开始”时间:

In [176]: df["date"].where(df["event_2"])
Out[176]:
0 NaT
1 NaT
2 2016-02-18
3 2016-01-01
4 NaT
5 NaT
6 NaT
7 2016-02-05
Name: date, dtype: datetime64[ns]

然后我们按 ID 分组并向前填充引用日期:

In [177]: df["date"].where(df["event_2"]).groupby(df["ID"]).ffill()
Out[177]:
0 NaT
1 NaT
2 2016-02-18
3 2016-01-01
4 2016-01-01
5 2016-01-01
6 2016-01-01
7 2016-02-05
Name: date, dtype: datetime64[ns]

之后我们只需要减去时间增量即可。你可以使用

df["time_1"] = df["time_1"].dt.days
df["time_2"] = df["time_2"].dt.days

如果您愿意,可以使用 float 而不是时间增量。

关于python - 在 pandas 中创建一个包含自上次事件以来的时间的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49910451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com