python - Pandas 无需更换即可加入

标签 python join pandas

这有点难以解释,但我会尽力而为。我现在得到的是我需要连接在一起的两个表,但我们并没有真正的唯一连接 ID。我有几个专栏要加入,这是我能做的最好的,我只想知道什么时候我们在加入的两边没有相同的数字。现在,如果右表与左表中的 2 个条目有 1 个匹配,则该 1 个匹配连接到两个条目。这让我不知道右表只有 1 个条目,而左边有 2 个条目。

我想要的是将右表连接到左表(外部),但我不想在每个条目中多次连接右表。因此,如果右表索引 3 可以连接到左侧的索引 1 和 2,我只希望它连接到索引 1。另外,如果索引 3 和索引 4 可以连接到索引 1 和 2,我想要索引1 匹配索引 3,索引 2 匹配索引 4。如果只有 1 个匹配(索引 1 --> 3),但左表中的索引 2 可以匹配到索引 3,我想要索引2 不加入。

示例可能最能说明这一点:

a_df = pd.DataFrame.from_dict({1: {'match_id': 2, 'uniq_id': 1}, 2: {'match_id': 2, 'uniq_id': 2}}, orient='index')

In [99]: a_df
Out[99]:
   match_id  uniq_id
1         2        1
2         2        2


In [100]: b_df = pd.DataFrame.from_dict({3: {'match_id': 2, 'uniq_id': 3}, 4: {'match_id': 2, 'uniq_id': 4}}, orient='index')

In [101]: b_df
Out[101]:
   match_id  uniq_id
3         2        3
4         2        4

在这个例子中,我希望 a_df 加入 b_df。我希望 b_df uniq_id 3 与 a_df uniq_id 1 匹配,b_df 4 与 a_df 2 匹配。

输出看起来像这样:

Out[106]:
   match_id_right  match_id  uniq_id  uniq_id_right
1               2         2        1              3
2               2         2        2              4

现在假设我们要将 a_df 连接到 c_df:

In [104]: c_df = pd.DataFrame.from_dict({3: {'match_id': 2, 'uniq_id': 3}, 4: {'match_id': 3, 'uniq_id': 4}}, orient='index')

In [105]: c_df
Out[105]:
   match_id  uniq_id
3         2        3
4         3        4

在这种情况下,我们在 a_df 上有 2 个 match_id,在 c_df 上只有 1 个 match_id 为 2。

在这种情况下,我只希望 uniq_id 1 与 uniq_id 3 匹配,而 uniq_id 2 和 uniq_id 4 都不匹配

   match_id_right  match_id  uniq_id  uniq_id_right
1               2         2        1              3
2             NaN         2        2            NaN
4               3       NaN      NaN              4

最佳答案

好的伙计们,所以答案其实很简单。

您需要做的是按匹配列对每个数据框(左、右)进行分组,然后为每个组添加一个新的计数器列。

现在您执行外部联接并包含计数器列,因此您将在 0,1 上进行匹配,但如果右边有一个 2,则它不匹配。如果左边只有 0,它将匹配右边,但如果右边有 0,1,则右边的 '1' 条目不匹配!

编辑:代码请求。

我手边什么都没有,但是很简单。例如,如果您有 2 列要在 ['amount','date'] 上匹配,那么您只需执行一个

left_df['Helper'] = left_df.groupby(['amount','date']).cumcount()
right_df['RHelper'] = right_df.groupby(['amount','date']).cumcount()

然后在连接中使用 Helper 列。

关于python - Pandas 无需更换即可加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35735264/

相关文章:

python - 如何从内存中手动删除张量?

php - 在 PHP 函数中使用 SQL 连接 5 个表

python - 当存在 unicode 值时计算 NaN

Python:为什么当我没有导入命令时这个命令起作用

python - 怎样才能得到收藏的收藏

python - 复制目录名称并将其放入变量中(python)

java - hibernate 中的多对一连接

mysql - 自表上的 INNER JOIN

python - 转换 pandas 系列和日期时间对象

python - 将 pandas 数据框中的行重新排列成列