为了账号安全,请及时绑定邮箱和手机立即绑定

搜索优化.

搜索优化.

四季花海 2023-07-27 10:10:13
我正在处理一个问题陈述,其中有两个数据帧 df1 和 df_main。df_main如下:users = ['id1','id1','id2','id2','id3','id3','id4']keywords = ['k1','k1', 'k2','k2','k2','k3','k3']quantity = [10,10,2,2,2,4,4]duration  = [1,1,3,3,3,2,2]df_main = pd.DataFrame(list(zip(users, keywords, quantity, duration)), columns = ['users','keywords','quantity','duration'])df_main 基本上是一个包含 user_id 信息、相应关键字以及数量和持续时间列的数据框df1 有一列用于 user_id,其余列用于 df_main 中的所有关键字。使用 main_df 作为参考,每个 user_id 和关键字对都标记为 1,否则保留为 0。这是 df1 的代码:columns = ['USER_ID','k1','k2','k3']users = ['id1','id2','id3','id4']values1 = [1,0,0,0]values2 = [0,1,1,0]values3 = [0,0,1,1]df1 = pd.DataFrame(list(zip(users, values1, values2, values3)), columns = columns)现在我想要以下数据框:其中total_quantity和total_duration是每个id和关键字对的数量和持续时间值的总和。该代码正在运行,但它真的很慢,我真的想摆脱循环。如果有人能向我展示一种更优化的方法,我将不胜感激。
查看完整描述

1 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

代码中性能的主要问题是多个循环。您可以使用 pandas 内置方法将所有循环委托给 numpy 的 C 实现。


例如,使用df_main.groupbysum、重塑和展平索引...然后与 合并df1。


df_temp = df_main.groupby(['users', 'keywords']).sum().unstack()

df_temp.columns = 'total_' + df_temp.columns.map('_'.join) # flatten column index


df1 = df1.merge(df_temp, left_on='USER_ID', right_on='users')

输出


       total_quantity_k1  total_quantity_k2  total_quantity_k3  \

users

id1                 20.0                NaN                NaN

id2                  NaN                4.0                NaN

id3                  NaN                2.0                4.0

id4                  NaN                NaN                4.0


       total_duration_k1  total_duration_k2  total_duration_k3

users

id1                  2.0                NaN                NaN

id2                  NaN                6.0                NaN

id3                  NaN                3.0                2.0

id4                  NaN                NaN                2.0

  USER_ID  k1  k2  k3  total_quantity_k1  total_quantity_k2  \

0     id1   1   0   0               20.0                NaN

1     id2   0   1   0                NaN                4.0

2     id3   0   1   1                NaN                2.0

3     id4   0   0   1                NaN                NaN


   total_quantity_k3  total_duration_k1  total_duration_k2  total_duration_k3

0                NaN                2.0                NaN                NaN

1                NaN                NaN                6.0                NaN

2                4.0                NaN                3.0                2.0

3                4.0                NaN                NaN                2.0


查看完整回答
反对 回复 2023-07-27
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信