gpt4 book ai didi

python - Pandas 数据框、应用函数、返回索引

转载 作者:太空宇宙 更新时间:2023-11-03 18:48:18 25 4
gpt4 key购买 nike

我有一个数据框 df,有两列:ID 和日期。它记录不同日期的 ID 事件。这两个字段都不是唯一的,但行的组合是唯一的(没有 ID 在同一日期有多个记录)。

我有以下函数来添加一个新列,以确定在给定的记录/日期,该 ID 是否(真/假)在未来的任何日期都有另一条记录:

def f(df):
count = pd.Series(np.arange(1, len(df)+1), index=df["date"])
day = count.index.shift(0, freq="D")
next18month = count.index.shift(3000, freq="D")
result = count.asof(next18month).fillna(0).values - count.asof(day).fillna(0).values
if result[0] > 0:
return pd.Series(1, df.index)
else:
return pd.Series(0, df.index)

然后我可以将该函数应用于我的数据框,按 ID 分组:

df["everagain"] = df.groupby("id").apply(f)

这不起作用。我认为 result[0] 是错误的。它在第一次出现 ID 时起作用(它计算第二次,触发 true 返回),但如果给定 id 有第二条记录,并且没有第三条记录,它仍然在以下位置返回“1”(True)第二条记录。有人可以帮忙正确的符号吗?

(注意:根据我的数据集,3000 天足以算作永远)。

例如,如果 df 看起来像:

   |  ID  |  Date
0 | A | 2010-01-01
1 | A | 2010-02-01
2 | A | 2010-02-15
3 | B | 2010-01-01
4 | C | 2010-02-01
5 | C | 2010-02-15

然后输出希望如下所示:

   |  ID  |  Date        | everagain
0 | A | 2010-01-01 | 1
1 | A | 2010-02-01 | 1
2 | A | 2010-02-15 | 0
3 | B | 2010-01-01 | 0
4 | C | 2010-02-01 | 1
5 | C | 2010-02-15 | 0

最佳答案

我原本以为我可以使用 .groupby("ID").last() 但无法完全让它工作。 (当然,我们可以使用 transform 来实现,但这感觉火力太大了。)

但是,如果您的数据按日期排序并且具有连续的ID,则您可以简单地比较ID是否等于下一个ID 。例如:

>>> df = df.sort(["ID", "Date"])
>>> df
ID Date
0 A 2010-01-01 00:00:00
1 A 2010-02-01 00:00:00
2 A 2010-02-15 00:00:00
3 B 2010-01-01 00:00:00
4 C 2010-02-01 00:00:00
5 C 2010-02-15 00:00:00
>>> df["everagain"] = df["ID"] == df["ID"].shift(-1)
>>> df
ID Date everagain
0 A 2010-01-01 00:00:00 True
1 A 2010-02-01 00:00:00 True
2 A 2010-02-15 00:00:00 False
3 B 2010-01-01 00:00:00 False
4 C 2010-02-01 00:00:00 True
5 C 2010-02-15 00:00:00 False

如果您想要 1 和 0 而不是 True 和 False,您可以使用 (df["ID"] == df["ID"].shift(-1)) *1)(df["ID"] == df["ID"].shift(-1)).astype(int) 进行转换。

关于python - Pandas 数据框、应用函数、返回索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18970880/

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