解析pandas数据帧的有效方法

时间:2017-11-02 06:28:09

标签: python pandas dataframe pandas-groupby

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

    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个条目。有什么方法可以改善这个吗?

1 个答案:

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