Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一种有效的数据帧解析方法_Python_Pandas_Dataframe_Pandas Groupby - Fatal编程技术网

Python 一种有效的数据帧解析方法

Python 一种有效的数据帧解析方法,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个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.

我有一个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条目在输出中,因为它的窗口为0,并且相应的“1”条目不在dataframe中。它与0值的减法窗口0范数一样好

i、 对于每一个用户,类型和特性,我需要减去规范,并创建一个新的数据帧。我们通过减法得到上面显示的结果表 (user1,true,all,0)范数与(user1,true,all,1)范数。基本上,每个用户、每个类型、每个专长都可以获得不同窗口之间的规范差异。没有必要让所有用户、类型、专长组合都有其相反的窗口项进行减法,在这种情况下,如果窗口为0,我们将该行复制到输出dataframe,或者丢弃它

我目前通过以下方式实现:

data = data.groupby(by=['user_id', 'feat', 'type'])
使用for循环在每个组上迭代,如下所示:

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

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

如果需要,用
1
窗口减去
0
窗口,首先使用+然后:


太棒了,它几乎完成了任务,但是user1,all1,null条目不应该在那里。这意味着如果我们没有窗口0条目,那么我们就会忽略它。你知道这将如何在如此大的数据上执行吗?第一步是通过
data=data[data['type']!='null']
删除
null
行。我想我没有正确地传达它。我的意思是,如果数据帧没有(用户、类型、专长)组合的条目,那么只有当窗口为0时,我们才保留此行。e、 这里(user4,null,all)应该在结果数据帧中,因为它的窗口是0。所以基本上我们需要做0 window-1 window,如果数据帧中没有1个window条目,那么我们只取0 windowOK,那么
user3 all2 true
呢,只有1个而没有0 window?结果如何
NaN
0.3
-0.3
?我编辑过,user3两者都有。但是是的,如果我们只有一个像你说的窗口,那么它应该是NAN,以后可以过滤。
 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