Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 高效地创建频率和最近度列_Python_Python 3.x_Pandas_Dictionary - Fatal编程技术网

Python 高效地创建频率和最近度列

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

这是一个非常特殊的问题-我的代码非常慢,不知道我是否做了一些明显错误的事情,或者有更好的方法

情况:我有两个数据帧,帧和联系人。frame是一个人员数据库,contacts是与这些人员的接触点。它们看起来像:

框架:

       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是正确的-谢谢!