解析 pandas 数据帧的有效方法

Effecient way to parse pandas dataframe

我有一个包含以下列的数据框:

    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 条目在输出中,因为它的 window 是 0 并且相应的“1”条目不在数据帧中。它与减法 window 0 范数和 0 值一样好。

即对于每个用户、类型和功能,我需要减去规范并制作一个新的数据框。我们通过减去得到上面显示的结果 table (user1,true,all,0) 范数与 (user1,true,all,1) 范数。基本上每个用户、每个类型、每个专长在 windows 之间获得规范差异。没有必要所有用户、类型、专长组合都有其相反的 window 条目要从中减去,在这种情况下,如果 window 为 0,我们将行复制到输出数据帧,否则丢弃它。

我目前通过这样做实现了:

data = data.groupby(by=['user_id', 'feat', 'type'])

并像这样使用 for 循环迭代每个组:

for tuple, group in data:
     #perform operations on this group

虽然这个解决方案有效,但它非常慢,因为 groupby 是一项昂贵的操作。我拥有的数据框包含大约 9000000 个条目。有什么办法可以改善吗?

如果需要用 1 window 减去 0 window 使用 set_index + unstack first and then 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