Python 一种有效的数据帧解析方法
我有一个dataframe,其中包含以下列: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.
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