我正在尝试通过交叉联接来创建职位和员工的所有可能组合。但是我想在加入他们时添加一个条件。例如。参见下面的示例数据框
<div>
<h1>title</h1>
<p>mr.admin your daily chart </p>
<div id="chart"></div>
</div>
我想找到>>> df_pos
Country Pos_id level
0 India 1 2
1 UK 2 2
2 USA 3 4
3 UAE 4 5
4 India 5 1
5 UK 6 3
>>> df_emp
Country Emp_id level
0 UK 11 3
1 UK 12 4
2 USA 13 4
3 Singapore 14 5
4 India 15 2
和Pos_id
的组合,其中首先匹配国家/地区,然后匹配的工作级别应等于或Emp_id
,例如。我们在+1/-1
(UK
)中有一个职位,我们有一个匹配的员工(pos_id 6
和11
),其国家/地区也是12
,工作{ {1}}分别是UK
和level
,分别是=和3
所需职位的工作级别(即工作4
+1
)。参见下面的示例输出
level
在python pandas中是否有一种简单的方法可以做到这一点。任何帮助将不胜感激。
答案 0 :(得分:1)
您可以在创建交叉联接表后根据条件进行过滤:
output_df = pd.merge(df_pos, df_emp, how='outer', on='Country')
condition = (output_df.level_x - output_df.level_y).between(-1, 1)
output_df = df_merged[condition][['Pos_id', 'Emp_id']]
答案 1 :(得分:0)
您可以简单地在“国家/地区”上进行加入,然后再过滤吗?
例如
我将级别列重命名为emp_level
和pos_level
之类,以使其更清晰,然后:
df = df_pos.merge(df_emp, on='Country')
output_df = df.loc[(df['pos_level'] >= df['emp_level'] - 1) & (df['pos_level'] <= df['emp_level'] + 1)]
不是最漂亮的东西,而是可以产生想要的东西。
答案 2 :(得分:0)
我尝试过:
data1 = pd.DataFrame({"Country":["India","UK","USA","UAE","India","UK"], "Pos_id":[1,2,3,4,5,6], "level": [2,2,4,5,1,3]})
data2 = pd.DataFrame({"Country":["UK", "UK","USA", "Singapore","India"],"Emp_id":[11,12,13,14,15], "level":[3,4,4,5,2]})
def get_df(country,pos_id,min,max):
lev = data1.loc[(data1.Country==country) & (data1.Pos_id==pos_id)]["level"]
data = data2.loc[(data2.Country==country) &(data2["level"].isin(list(range(int(lev)-min,int(lev)+max))))]
return data
print(get_df("UK",6,1,1))