添加从组开始到perrow计算时间差的列?

2024-09-26 22:49:29 发布

您现在位置:Python中文网/ 问答频道 /正文

(新手对Python和熊猫)

我有一个1500万到2000万行的数据集,每一行都是一个“用户”出现的时间索引观察,我需要分析每个用户的每天访问模式,并将其标准化为第一次访问。所以,我希望用X轴表示“首次访问后的天数”和Y轴表示“该用户在这一天的访问量”,也就是说,我需要得到一个按时间增量索引的序列,以及以该delta结束的时间段内的访问值[0:1,3:5,4:2,6:8],但是我很早就被卡住了。。。在

我从以下几点开始:

rng = pd.to_datetime(['2000-01-01 08:00', '2000-01-02 08:00',
                  '2000-01-01 08:15', '2000-01-02 18:00',
                  '2000-01-02 17:00', '2000-03-01 08:00',
                  '2000-03-01 08:20','2000-01-02 18:00'])
uid=Series(['u1','u2','u1','u2','u1','u2','u2','u3'])
misc=Series(['','x1','A123','1.23','','','','u3'])
df = DataFrame({'uid':uid,'misc':misc,'ts':rng})
df=df.set_index(df.ts)

grouped = df.groupby('uid')
firstseen = grouped.first()

ts值对每个uid是唯一的,但是可以重复(可以同时看到两个uid,但是任何一个{}在任何一个时间戳中只会出现一次)

第一步是(我认为)向DataFrame添加一个新列,为每个观察显示该用户的第一个观察值的timedelta值。但是,我被困在数据帧中了。我尝试的最简单的方法给了我一个对新手来说很模糊的错误消息:

^{pr2}$

所以我尝试了一种暴力方法:

def f(row):
    return row.ts - firstseen.ts[row.uid]
df['sinceseen'] = Series([{idx:f(row)} for idx, row in df.iterrows()], dtype=timedelta)

在这个尝试中,df得到了一个sinceseen,但它都是NaN,并为type(df.sinceseen[0])显示了一个float类型——不过,如果我只是打印这个系列(在iPython中),它会生成一个很好的timedeltas列表。在

我在反复研究“Python for Data Analysis”,似乎apply()应该可以工作,但是

def fg(ugroup):
    ugroup['sinceseen'] = ugroup.index - ugroup.index.min()
    return ugroup

df = df.groupby('uid').apply(fg)

在“ugroup.index - ugroup.index.min(”上给我一个TypeError,即使两个操作数中的每一个都是Timestamp。在

所以,我在发火-有人能给我指出“熊猫”的方法来获取数据结构Ineed吗?在


Tags: 方法用户dfuidindex时间rowseries
1条回答
网友
1楼 · 发布于 2024-09-26 22:49:29

这有助于你开始吗?在

>>> df = DataFrame({'uid':uid,'misc':misc,'ts':rng})
>>> df = df.sort(["uid", "ts"])
>>> df["since_seen"] = df.groupby("uid")["ts"].apply(lambda x: x - x.iloc[0])
>>> df
   misc                  ts uid        since_seen
0       2000-01-01 08:00:00  u1  0 days, 00:00:00
2  A123 2000-01-01 08:15:00  u1  0 days, 00:15:00
4       2000-01-02 17:00:00  u1  1 days, 09:00:00
1    x1 2000-01-02 08:00:00  u2  0 days, 00:00:00
3  1.23 2000-01-02 18:00:00  u2  0 days, 10:00:00
5       2000-03-01 08:00:00  u2 59 days, 00:00:00
6       2000-03-01 08:20:00  u2 59 days, 00:20:00
7    u3 2000-01-02 18:00:00  u3  0 days, 00:00:00

[8 rows x 4 columns]

相关问题 更多 >

    热门问题