我有关于课程出席率的数据,我的目标是获取每个课程的出席者人数。不幸的是,领导课程的人员也位于数据中,需要删除。我不能只删除带有该人姓名的所有行,因为如果他们参加了由他人主持的课程,那么他们应该算作与会者。
我有两个数据框:
new_data
:
|name | email | file | course | date |
|-----|-------|------|--------|--------|
|jo |j@c.i |one |A |6/10/20 |
|bo |b@c.i |one |A |6/10/20 |
|bo |b@c.i |one |B |6/11/20 |
|mo |m@c.i |one |B |6/11/20 |
map_data
:
|lead | course | date |
|-----|--------|--------|
|jo |A |6/10/20 |
|bo |B |6/11/20 |
|mo |B |6/11/20 |
我需要在new_data
中创建一个新列,以标记某人是否是潜在客户。有一个查找表map_data
,该表指示谁主持了每个会话。
这是输出的样子:
|name | email | file | course | date | lead |
|-----|-------|------|--------|--------|------|
|jo |j@c.i |one |A |6/10/20 |1 |
|bo |b@c.i |one |A |6/10/20 |0 |
|bo |b@c.i |one |B |6/11/20 |1 |
|mo |m@c.i |one |B |6/11/20 |1 |
请注意,bo
不是course
A
的领先者,而是B
的领先者。
编辑:某些课程有多个线索:B
有两个线索。在我使用此线程中建议的解决方案来解决此问题的某些尝试中,这导致了重复问题。
这是一个有限的例子,但是不同的人在不同的日子上都跑相同的路线。 jo
可能在其他日期运行course
A
。
对于new_data
中的每一行,如果new_data["lead"]
,1
和name
匹配course
,则需要将date
标记为map_data
。 new_data["lead"]
中的值。在所有其他情况下,0
应该是property abc(a, b, c);
disable iff (c) @(posedge clk) a |=> b;
endproperty
。
我陷入困境是因为我不知道如何使用三列在数据框之间进行查找。
答案 0 :(得分:0)
这样的作品行吗?
tmp = new_data.set_index(["name","course", "date"]).join(map_data.set_index(["lead","course", "date"]))
tmp["is_lead"] = tmp["name"] == tmp["lead"]
tmp["is_lead"] = tmp["is_lead"].astype('int')
答案 1 :(得分:0)
以下功能可能会有所帮助:
def lead(df, df_map):
# Get the leads names, course and date in a single string, like a code. e.g 'joA6/10/20'
leads = [str(df_map.lead[j])+str(df_map.course[j])+str(df_map.date[j]) for j in range(df_map.shape[0])]
# loop to create the data for LEAD column
lead_col = [1 if str(df.name[i])+str(df.course[i])+str(df.date[i]) in leads else 0 for i in range(df.shape[0])]
# insert LEAD column in the df and return
df['lead'] = lead_col
return df
我的输入示例:
name email file course date
jo j@c.i one A 6/10/20
bo b@c.i one B 6/11/20
bo b@c.i one B 6/10/20
mo mo@i one B 6/10/20
jay j@i one B 6/11/20
地图:
lead course date
jo A 6/10/20
bo B 6/11/20
mo B 6/10/20
输出:
name email file course date lead
jo j@c.i one A 6/10/20 1
bo b@c.i one B 6/11/20 1
bo b@c.i one B 6/10/20 0
mo mo@i one B 6/10/20 1
jay j@i one B 6/11/20 0
答案 2 :(得分:0)
使用pd.crosstab(),可以列出领导频率。 stack和rename columns适当。这给出了一个新的数据框,您可以使用.combine_first()加入到new_data中。这将附加交叉表产生的所有行。删除所有NaN。
请注意 df=map_data
:
链式解决方案
new_data.combine_first(pd.crosstab([df.lead, df.course], df.date).stack().reset_index().rename(columns={'lead':'name',0:'lead'})).dropna()
分步解决方案
#Crosstab
df3=pd.crosstab([df.lead, df.course], df.date).stack().reset_index().rename(columns={'lead':'name',0:'lead'})
#Combine_first
res=new_data.combine_first(df3).dropna()
print(res)
course date email file lead name
0 A 6/10/20 j@c.i one 0.0 jo
1 A 6/10/20 b@c.i one 1.0 bo
2 B 6/11/20 b@c.i one 1.0 bo