问题描述
我正在尝试使用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给主人。
那时,我想在num1的值在num1_min / max之间并且num2的值在num2_min / max之间的条件下left join
它们。
主数据集只有一个id2或null。
所以id2不会一式两份加入。
请建议我。
1楼
可以使用布尔掩码来完成此操作。 即在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)