我有一个DF 1,其中每一行代表一个“事件”。每个事件都有“用户”和“时间”列:
DF1:
"user","time"
user1,2022-11-14 00:00:04
user2,2022-11-16 21:34:45
user1,2022-11-14 00:15:22
user3,2022-11-17 15:32:25
...
“time”值是一周内的任何时间戳:从2022年11月14日到2022年11月20日。有10000个不同的用户和2700万个事件。
我必须将一周划分为8个小时的时间段(总共21个时间段),对于每个用户,我需要查看是否可以在每个时间段中看到该用户的任何事件。
然后,我应该创建一个DF 2(其中每行都是一个用户),它有21列(每个插槽一列),列号为0或1:如果在该插槽中未看到用户,则为0;如果在该插槽中看到用户,则为1。
第二次飞行时间:
"user","slot1","slot2","slot3",...,"slot21"
user1,1,0,0,0,0,0,...,0
user2,0,0,1,1,1,0,...,0
user3,1,1,1,0,0,1,...,1
...
(之后,我将需要订购DF 2并将其绘制为备用矩阵,但那是另一回事...)
我设法填充了1个单行DF 2,但1个用户持续30秒,方式如下:
slots = pd.date_range('2022-11-14', periods=22, freq='8h')
row=[]
for i in np.arange(0,slots.value_counts().sum()-1):
if DF1[(DF1.user=="user1")&(DF1.time.between(slots[i],slots[i+1]))].shape[0] >=1:
row.append(1)
else:
row.append(0)
print(row)
因此,为1万名用户进行此过程将持续近4天...
有没有人知道我怎样才能更快地创建DF 2??也许像DF1.groupby('user').time这样的东西,然后还有什么?我可以用Pandas或任何其他方式,甚至不同的语言,如果我得到DF 2中的备用矩阵!
任何帮助都将不胜感激!
1条答案
按热度按时间jdzmm42g1#
将
crosstab
与cut
一起用于计数值,如果需要0,1
输出,则比较不等于0
并转换为整数: