【问题标题】:Mapping a column from one dataframe to another in pandas based on condition根据条件将一列从一个数据帧映射到另一个数据帧
【发布时间】:2019-10-17 21:54:53
【问题描述】:
我有两个数据框 df_inv
df_inv
和 df_sales。
df_sales
我需要在 df_inv 中添加一个列,其中包含基于 df_sales 中标记的医生的销售人员姓名。如果 df_sales 中的销售人员与医生的关系是唯一的,这将是一个简单的合并。但是销售人员之间的医生所有权发生了变化,并且每次转移都会增加一行,并更新日期。
因此,如果发票日期小于更新日期,则应使用以前的标记,如果以前没有标记,则应显示 nan。换句话说,对于 df_inv 中的每个 invoice_date,应使用 df_sales 中之前的最大 updated_date 进行标记。
结果表应该是这样的
Final Table
我对编程比较陌生,但我通常可以找到解决问题的方法。但我无法弄清楚这一点。任何帮助表示赞赏
【问题讨论】:
标签:
python
pandas
mapping
【解决方案1】:
import pandas as pd
import numpy as np
df_inv = pd.read_excel(r'C:\Users\joy\Desktop\sales indexing\consolidated report.xlsx')
df_sales1 = pd.read_excel(r'C:\Users\joy\Desktop\sales indexing\Sales Person
tagging.xlsx')
df_sales2 = df_sales1.sort_values('Updated Date',ascending=False)
df_sales = df_sales2.reset_index(drop=True)
sales_tag = []
sales_dup = []
counter = 0
for inv_dt, doc in zip(df_inv['Invoice_date'],df_inv['Doctor_Name']):
for sal, ref, update in zip(df_sales['Sales
Person'],df_sales['RefDoctor'],df_sales['Updated Date']):
if ref==doc:
if update<=inv_dt and sal not in sales_dup :
sales_tag.append(sal)
sales_dup.append(ref)
break
else:
pass
else:
pass
sales_dup = []
counter = counter+1
if len(sales_tag)<counter:
sales_tag.append('none')
else:
pass
df_inv['sales_person'] = sales_tag
这似乎有效。