熊猫加入而无需替换

时间:2016-03-01 22:56:03

标签: 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上的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

1 个答案:

答案 0 :(得分:1)

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

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

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

编辑:代码请求。

我没有任何方便,但它很简单。如果你有2列,你在['金额','日期']上匹配,那么你只需要做一个

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

然后在连接中使用Helper列。