我正在尝试使用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不会一式两份加入。
请告诉我。
答案 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)