熊猫根据条件加入数据框

时间:2018-08-09 09:11:46

标签: python pandas

我正在尝试通过交叉联接来创建职位和员工的所有可能组合。但是我想在加入他们时添加一个条件。例如。参见下面的示例数据框

<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/-1UK)中有一个职位,我们有一个匹配的员工(pos_id 611),其国家/地区也是12,工作{ {1}}分别是UKlevel,分别是=和3所需职位的工作级别(即工作4 +1)。参见下面的示例输出

level

在python pandas中是否有一种简单的方法可以做到这一点。任何帮助将不胜感激。

3 个答案:

答案 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_levelpos_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))