【问题标题】:how to merge 2 datasets under complex conditions by pandaspandas如何在复杂条件下合并2个数据集
【发布时间】:2018-07-22 07:03:59
【问题描述】:

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

这是主数据集:

id 数字 1 数字 2 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

我期望的输出:

编号 1 编号 2 编号 2 0 5 8 1 1 2 9 0 2 8 7 2 3 9 6 2

我想把 id2 给主人。 当时我想left join他们,条件是num1的值在num1_min/max之间,num2的值在num2_min/max之间。 主数据集只有一个 id2 或 null。所以 id2 不会重复加入。

请给我建议。

【问题讨论】:

  • 做左连接,然后剔除不满足条件的行。
  • 有条件加入难吗?因为这些数据集超重,我想同时加入和消除。
  • Pandas 没有条件连接。
  • omg。我不知道...我明白了。谢谢你的建议!
  • 您可以将数据集存储在关系数据库中,使用它自己的条件连接工具,然后检索结果。

标签: python pandas join merge


【解决方案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)

【讨论】:

  • 您的第一个建议工作正常。我可以得到我想要的输出,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2019-08-10
  • 2017-12-30
  • 1970-01-01
  • 2021-09-29
  • 2020-07-24
  • 2019-07-27
相关资源
最近更新 更多