条件填充数据框 pandas

Conditional fill dataframe pandas

我对 pandas 还很陌生,所以请多多包涵。我有一个带有交互数据的数据框(交互的开始时间、交互的结束时间、进行交互的用户 A 和用户 B):

begin, end, userA, userB.

现在我想将此数据转换为以下格式(从 0 到 x 的时间,一个用户的 userId,如果有交互则为布尔值 yes 或 no)。

time, userId, interaction.

我看到一些关于使用 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

有人能给我指出正确的方向,例如:我应该看的方法吗?

假设您有以下源 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