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)
好吧,伙计们,答案其实很简单。
您需要做的是将每个数据帧(左、右)按匹配的列分组,然后为每个组添加一个新的计数器列。
现在您执行外连接并包含计数器列,因此您将匹配 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 列。