解析 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
我有一个包含以下列的数据框:
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