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