我有一个包含以下列的数据框:
feat norm window type user_id
----------------------------------------
0 all 0.110000 0 true user1
1 all1 0.232110 0 null user2
2 all2 0.324234 0 true user3
3 all 0.323120 0 null user4
4 all 0.322000 1 true user1
5 all1 0.100000 1 null user1
6 all1 0.200000 1 null user2
7 all2 0.300000 1 true user3
我需要创建一个包含以下内容的结果数据框:
feat user result_norm
--------------------------------
all user1_true -0.212
all1 user2_null 0.03211
all2 user3_true 0.0324
all user4_null 0.323120
注意:user4条目在输出中,因为其窗口为0且各自的“1”条目不在数据帧中。它与减法窗口0范数一样好,值为0。
即。对于每个用户,类型和功能,我需要减去规范并创建一个新的数据帧。我们通过减去得到上面显示的结果表 (user1,true,all,0)规范与(user1,true,all,1)规范。基本上每个用户,每种类型,每个壮举得到窗口之间的规范差异。所有用户,类型,专长组合都没有必要减去相反的窗口条目,在这种情况下,如果窗口为0,我们将行复制到输出数据框或者丢弃它。
我目前通过以下方式实现:
data = data.groupby(by=['user_id', 'feat', 'type'])
并使用for循环遍历每个组,如下所示:
for tuple, group in data:
#perform operations on this group
虽然这个解决方案有效,但由于groupby是昂贵的操作,所以它非常慢。我拥有的数据帧包含大约9000000个条目。有什么方法可以改善这个吗?
答案 0 :(得分:1)
如果需要使用0
窗口减去1
窗口,请先使用set_index
+ unstack
,然后使用sub
:
data = data.set_index(['user_id', 'feat', 'type', 'window'])['norm'].unstack().fillna({1:0})
print (data)
window 0 1
user_id feat type
user1 all true 0.110000 0.322
all1 null NaN 0.100
user2 all1 null 0.232110 0.200
user3 all2 true 0.324234 0.300
user4 all null 0.323120 0.000
df = data[0].sub(data[1]).reset_index(name='result_norm')
print (df)
user_id feat type result_norm
0 user1 all true -0.212000
1 user1 all1 null NaN
2 user2 all1 null 0.032110
3 user3 all2 true 0.024234
4 user4 all null 0.323120