熊猫加入而无需替换

use*_*719 6 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
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我想要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
Run Code Online (Sandbox Code Playgroud)

现在假设我们想将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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们在a_df上有match_ids为2,在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
Run Code Online (Sandbox Code Playgroud)

use*_*719 2

好吧,伙计们,答案其实很简单。

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

现在您执行外连接并包含计数器列,因此您将匹配 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()
Run Code Online (Sandbox Code Playgroud)

然后在连接中使用 Helper 列。