条件填充数据帧熊猫

时间:2016-08-05 08:06:46

标签: python pandas dataframe conditional data-science

我对熊猫很新,所以请耐心等待。我有一个包含交互数据的数据框(交互的开始时间,交互的结束时间,具有交互的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

有人能指出我正确的方向,比如:我应该注意哪些方法?

1 个答案:

答案 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