熊猫:根据不同数据框的多列中的匹配值在一个数据框中创建一列

时间:2020-07-01 19:44:09

标签: python pandas dataframe

我有关于课程出席率的数据,我的目标是获取每个课程的出席者人数。不幸的是,领导课程的人员也位于数据中,需要删除。我不能只删除带有该人姓名的所有行,因为如果他们参加了由他人主持的课程,那么他们应该算作与会者。

我有两个数据框:

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"]1name匹配course,则需要将date标记为map_datanew_data["lead"]中的值。在所有其他情况下,0应该是property abc(a, b, c); disable iff (c) @(posedge clk) a |=> b; endproperty

我陷入困境是因为我不知道如何使用三列在数据框之间进行查找。

3 个答案:

答案 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(),可以列出领导频率。 stackrename 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
相关问题