Python 当在每一行中需要使用整个数据进行比较时,在熊猫中使用矢量化

Python 当在每一行中需要使用整个数据进行比较时,在熊猫中使用矢量化,python,pandas,performance,dataframe,Python,Pandas,Performance,Dataframe,我有下面的联系方式 mobile email contact_code index_clone contact_day 0 0972135314 abc@gmail.com 1 0 9/26/2018 1 0972135314 cde@gmail.com 2 1 9/26/2018 2 0943360092 cmt@gmail.com 3

我有下面的联系方式

    mobile      email           contact_code index_clone contact_day
0   0972135314  abc@gmail.com   1            0           9/26/2018
1   0972135314  cde@gmail.com   2            1           9/26/2018
2   0943360092  cmt@gmail.com   3            2           9/25/2018
3   0988870766  def@gmail.com   4            3           9/24/2018
4   0972135314  cmt@gmail.com   5            4           9/27/2018
我需要创建一个名为“user”的新列。用户列从联系人代码获取数据,如果联系人有相同的手机或电子邮件,则他们是相同的用户,并且这些联系人的用户值是最小的联系人代码

例如: 第4行:手机是0972135314,所以它匹配第0行和第1行,电子邮件是cmt@gmail.com所以它与第2行匹配。所有3个匹配行的contact_代码都是{1,2,3},因此第4行的user列是最小值1

问题是,我需要遍历每一行以找到匹配的行,获取联系人代码列表并将最小值分配给用户列。所以熊猫跑得很慢。我怎样才能使流程更快?这是我的密码

for idx in data.index:
    data.set_value(idx,"user",min(data.loc[(data["index_clone"] <= idx) & ((data["mobile"] == data.get_value(idx,"mobile")) | (data["email"] == data.get_value(idx,"email"))),"contact_code"]))
data.index中的idx的

data.set_value(idx,“user”,min(data.loc[(data[“index_clone”])一种方法是通过降序
contact_code
对数据帧进行排序,并创建两个字典映射。然后使用这些映射导出正确的
contact_code

这是因为在字典构建期间,键的值会被以后的赋值覆盖。您只对最小映射感兴趣,这是通过我们的初始排序应用的

df_rev = df.sort_values('contact_code', ascending=False)
d1 = df_rev.set_index('mobile')['contact_code'].to_dict()
d2 = df_rev.set_index('email')['contact_code'].to_dict()

df['contact_code_new'] = np.minimum(df['mobile'].map(d1), df['email'].map(d2))

print(df)

      mobile          email  contact_code  index_clone  contact_code_new
0  972135314  abc@gmail.com             1            0                 1
1  972135314  cde@gmail.com             2            1                 1
2  943360092  cmt@gmail.com             3            2                 3
3  988870766  def@gmail.com             4            3                 4
4  972135314  cmt@gmail.com             5            4                 1

您可以分别获得每组手机的最低联系人代码,然后获得每组电子邮件的最低联系人代码:

min_mobile_cc = df.groupby("mobile").contact_code.transform(np.min)
min_email_cc = df.groupby("email").contact_code.transform(np.min)
对于数据中的每一行,这将存储其原始联系人代码或同一移动/电子邮件组中任何其他行的最小联系人代码

通过此准备,您可以选择移动组和电子邮件组之间的全球最小联系代码:

df["user"] = np.minimum(min_mobile_cc, min_email_cc)

谢谢你有趣的方法。但我还有一个问题。每行都有一个联系人日列,这是联系人的日期。例如,用户1有3个联系人行(第0、1和4行)。第0行的联系人日和第1行的联系人日是2018年9月26日,第4行的联系人日是2018年9月27日。因此,第0行和第1行的“转”列是1,第4行的“转”is 2.我如何才能在不循环每一行的情况下获得用户联系人的轮次?我不确定我是否理解你所说的轮次。也许你可以用一个例子来说明用户的轮次。最好为此创建一个新问题,在这些密集的评论中很难看到数据,而且这个问题与问题并不真正相关N