如何通过pandas在复杂条件下合并2个数据集

时间:2018-02-12 06:49:18

标签: python pandas join merge

我正在尝试使用pandas合并两个数据集。

这是主数据集:

id  num1   num2
0   5      8
1   2      9
2   8      7
3   9      6

这是另一个:

id2  num1_min  num1_max  num2_min  num2_max
0    1         3         8         10       
1    3         6         6         10
2    7         9         6         9

我期望的输出:

id  num1   num2  id2
0   5      8     1
1   2      9     0  
2   8      7     2
3   9      6     2

我想给主人一个id2。 那时,我想{num}的值在num1_min / max和num2的值在num2_min / max之间的条件下left join。 主数据集只有一个id2或null。所以id2不会一式两份加入。

请告诉我。

1 个答案:

答案 0 :(得分:0)

可以使用布尔掩码来完成此操作。即在df中找到满足连接条件的索引id2。

In [1]: import pandas as pd
In [2]: df
Out[2]: 
   id  num1  num2
0   0     5     8
1   1     2     9
2   2     8     7
3   3     9     6

In [3]: df1
Out[3]: 
   id2  num1_min  num1_max  num2_min  num2_max
0    0         1         3         8        10
1    1         3         6         6        10
2    2         7         9         6         9

#find id2 based on conditions
In [4]: df['id2'] = df.apply(lambda row: (((row['num1'] >= df1['num1_min']) &
                           (row['num1'] <= df1['num1_max'])) &
                          ((row['num2'] >= df1['num2_min']) &
                           (row['num2'] <= df1['num2_max']))).idxmax(), axis=1)

In [5]: df
Out[5]: 
   id  num1  num2  id2
0   0     5     8    1
1   1     2     9    0
2   2     8     7    2
3   3     9     6    2

上面,我使用apply来遍历df行,根据条件检查每一行,然后在df1中找到满足条件的索引。

修改

查找id2的另一种方法

df['id2'] = df.apply(lambda row: df1.loc[(((row['num1'] >= df1['num1_min']) &
                                           (row['num1'] <= df1['num1_max'])) &
                                          ((row['num2'] >= df1['num2_min']) &
                                           (row['num2'] <= df1['num2_max']))),
                                         'id2'].values[0], axis=1)