搜索优化.

我正在处理一个问题陈述,其中有两个数据帧 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)

现在我想要以下数据框:

http://img3.mukewang.com/64c1d2320001b77515210148.jpg

其中total_quantity和total_duration是每个id和关键字对的数量和持续时间值的总和。


该代码正在运行,但它真的很慢,我真的想摆脱循环。如果有人能向我展示一种更优化的方法,我将不胜感激。



四季花海
浏览 86回答 1
1回答

万千封印

代码中性能的主要问题是多个循环。您可以使用 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 indexdf1 = df1.merge(df_temp, left_on='USER_ID', right_on='users')输出       total_quantity_k1  total_quantity_k2  total_quantity_k3  \usersid1                 20.0                NaN                NaNid2                  NaN                4.0                NaNid3                  NaN                2.0                4.0id4                  NaN                NaN                4.0       total_duration_k1  total_duration_k2  total_duration_k3usersid1                  2.0                NaN                NaNid2                  NaN                6.0                NaNid3                  NaN                3.0                2.0id4                  NaN                NaN                2.0  USER_ID  k1  k2  k3  total_quantity_k1  total_quantity_k2  \0     id1   1   0   0               20.0                NaN1     id2   0   1   0                NaN                4.02     id3   0   1   1                NaN                2.03     id4   0   0   1                NaN                NaN   total_quantity_k3  total_duration_k1  total_duration_k2  total_duration_k30                NaN                2.0                NaN                NaN1                NaN                NaN                6.0                NaN2                4.0                NaN                3.0                2.03                4.0                NaN                NaN                2.0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python