Python 高效地创建频率和最近度列
这是一个非常特殊的问题-我的代码非常慢,不知道我是否做了一些明显错误的事情,或者有更好的方法 情况:我有两个数据帧,帧和联系人。frame是一个人员数据库,contacts是与这些人员的接触点。它们看起来像: 框架:Python 高效地创建频率和最近度列,python,python-3.x,pandas,dictionary,Python,Python 3.x,Pandas,Dictionary,这是一个非常特殊的问题-我的代码非常慢,不知道我是否做了一些明显错误的事情,或者有更好的方法 情况:我有两个数据帧,帧和联系人。frame是一个人员数据库,contacts是与这些人员的接触点。它们看起来像: 框架: name id 166 Bob 253 Serge 1623 Anna 766 Benna 981 Paul 联系人: id type date 0 253 email 2016-01-05
name
id
166 Bob
253 Serge
1623 Anna
766 Benna
981 Paul
联系人:
id type date
0 253 email 2016-01-05
1 1623 sale 2012-05-12
2 1623 email 2017-12-22
3 253 sale 2018-02-15
我想在框架中添加两列,“最近”和“3年联系人计数”,这两列给出最近的联系人(如果有)和过去3年的联系人数量
机架约为100000行,触点约为95000
到目前为止,我正在减少要迭代的id数量,然后为每个id创建一个具有正确值的dict:
id_list = [i for i in frame.index if i in contacts['id']]
freq_rec_dict = {i: [contacts.loc[contacts['id']==i,'value'].max(),
len(contacts.loc[(contacts['id']==i)&(contacts['value']>dt(2016,1,1))])]
for i in id_list}
然后,我将dict转换为数据帧并执行连接:
freq_rec_df = pd.DataFrame.from_dict(freq_rec_dict, orient='index',columns=['most_recent','3 year contact count'])
result = frame.join(freq_rec_df)
这确实给了我我所需要的,但字典理解花了30分钟-我觉得必须有一个更有效的方法来做到这一点,我将需要在未来。任何想法都将不胜感激-谢谢 您没有指定输出,但这里是。您应该利用内置的groupby方法,而不是将数据从帧中取出并返回到帧中,然后进行合并
contacts.groupby('id')[['date','type']].max()
date type
id
253 2018-02-15 sale
1623 2017-12-22 sale
如果需要节省内存空间,可以在一行中完成。同样,您没有给出首选输出,因此我使用了左连接。您还可以使用“内部”仅保留存在记录的行
df=pd.merge(frame,contacts.groupby('id')[['date','type']].max(), left_index=True, right_index=True, how='left')
name date type
id
166 Bob NaN NaN
253 Serge 2018-02-15 sale
1623 Anna 2017-12-22 sale
766 Benna NaN NaN
981 Paul NaN NaN
虽然这并没有真正回答整个问题,但每列添加的单独groupbys是正确的-谢谢!