我对熊猫很新,所以请耐心等待。我有一个包含交互数据的数据框(交互的开始时间,交互的结束时间,具有交互的userA和userB):
开始,结束,用户A,用户B.
现在我想将这些数据转换为以下格式(从0到x的时间,一个用户的userId,如果有交互,则为布尔值yes或no)。
时间,userId,互动。
我看到一些关于使用np.where的条件数据帧的帖子,但我还不确定如何将它们粘在一起。我很抱歉没有提供代码示例。
实施例: (输入):
begin, end, userA, userB
130, 300, 1, 2
(输出):
time, user, interaction
...
130, 1, yes
130, 2, yes
131, 1, yes
131, 2, yes
...
300, 1, yes
300, 2, yes
301, 1, no
301, 2, no
有人能指出我正确的方向,比如:我应该注意哪些方法?
答案 0 :(得分:1)
假设您有以下来源DF:
In [134]: df
Out[134]:
begin end userA userB
0 130 134 1 2
1 201 203 5 1
2 333 334 2 5
我们可以做到以下几点:
time_range = np.arange(0, 1001)
dfs = []
for u in df[['userA','userB']].stack().unique():
dfs.append(pd.DataFrame({'time':time_range,
'user':[u] * len(time_range),
'interaction': ['no'] * len(time_range)}))
rep = pd.concat(dfs, ignore_index=True)
for i,r in df.iterrows():
qry = 'user in {} and {} <= time <= {}'.format([r.userA, r.userB], r.begin, r.end)
print('Query: [{}]'.format(qry))
rep.ix[rep.eval(qry), 'interaction'] = 'yes'
输出:
Query: [user in [1, 2] and 130 <= time <= 134]
Query: [user in [5, 1] and 201 <= time <= 203]
Query: [user in [2, 5] and 333 <= time <= 334]
检查:
In [133]: rep[rep.interaction == 'yes']
Out[133]:
interaction time user
130 yes 130 1
131 yes 131 1
132 yes 132 1
133 yes 133 1
134 yes 134 1
201 yes 201 1
202 yes 202 1
203 yes 203 1
1131 yes 130 2
1132 yes 131 2
1133 yes 132 2
1134 yes 133 2
1135 yes 134 2
1334 yes 333 2
1335 yes 334 2
2203 yes 201 5
2204 yes 202 5
2205 yes 203 5
2335 yes 333 5
2336 yes 334 5