Python中合并时如何避免笛卡尔坐标

Python中合并时如何避免笛卡尔坐标,python,pandas,merge,duplicates,cartesian,Python,Pandas,Merge,Duplicates,Cartesian,我正在尝试合并2个数据集X和Y。数据集X具有具有重复值的连接键列。数据集Y具有连接键列和一个附加列。数据集图像已上载到下面。问题是,由于数据集X中存在重复项,我希望避免笛卡尔积。这可以通过使用for循环手动合并来手动完成,但这很耗时。任何人都可以提供更好的方法 在这种情况下,因为您只需要带一列,.map可能更合适。我们在每个EMM\u ID组中取第一个值,并仅映射该值。索引上的对齐可确保其余部分变成NaN 样本数据 代码 输出:df_x 如果需要带多个列,则可以拆分数据帧,与子集合并,然后连接

我正在尝试合并2个数据集X和Y。数据集X具有具有重复值的连接键列。数据集Y具有连接键列和一个附加列。数据集图像已上载到下面。问题是,由于数据集X中存在重复项,我希望避免笛卡尔积。这可以通过使用for循环手动合并来手动完成,但这很耗时。任何人都可以提供更好的方法


在这种情况下,因为您只需要带一列,
.map
可能更合适。我们在每个
EMM\u ID
组中取第一个值,并仅映射该值。索引上的对齐可确保其余部分变成
NaN

样本数据 代码 输出:
df_x

如果需要带多个列,则可以拆分
数据帧
,与子集合并,然后连接回一个数据帧

df_x = pd.DataFrame({'EMM_ID': [610462,610462,610462,610462, 61000, 61000],
                     'ID_home': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})
df_y = pd.DataFrame({'EMM_ID': [610462, 61000], 'ID_home': [81000, 18], 'Val_2': ['A', 'F']})

to_merge = df_x.groupby('EMM_ID').head(1)
keep = df_x[~df_x.index.isin(to_merge.index)]

pd.concat([keep, to_merge[['EMM_ID']].merge(df_y)], sort=False).sort_index() 
输出:

   EMM_ID  ID_home Val_2
0  610462  81000.0     A
1  610462      NaN   NaN
1   61000     18.0     F
2  610462      NaN   NaN
3  610462      NaN   NaN
5   61000      NaN   NaN
   EMM_ID  colkey  ID_home
0  610462       0  81000.0
1  610462       1      NaN
2  610462       2      NaN
3  610462       3      NaN
4   61000       0     18.0
5   61000       1      NaN
使用@Alollz设置:

df_x = pd.DataFrame({'EMM_ID': [610462, 610462, 610462, 610462, 61000, 61000],
                     'ID_home': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})
df_y = pd.DataFrame({'EMM_ID': [610462, 61000], 'ID_home': [81000, 18]})
你可以创建一个新的“密钥”加入cumcount

colkey = 'EMM_ID'
df_x = df_x.assign(colkey=df_x.groupby(colkey).cumcount())
df_y = df_y.assign(colkey=df_y.groupby(colkey).cumcount())

df_x[['EMM_ID','colkey']].merge(df_y, on=['EMM_ID','colkey'], how='left')
输出:

   EMM_ID  ID_home Val_2
0  610462  81000.0     A
1  610462      NaN   NaN
1   61000     18.0     F
2  610462      NaN   NaN
3  610462      NaN   NaN
5   61000      NaN   NaN
   EMM_ID  colkey  ID_home
0  610462       0  81000.0
1  610462       1      NaN
2  610462       2      NaN
3  610462       3      NaN
4   61000       0     18.0
5   61000       1      NaN

我读你的问题越多,就越不明白你在问什么。是否要合并两个
数据帧
?它为什么要使用笛卡尔积来实现这一点?看看这里合并是如何工作的。默认情况下不涉及产品。笛卡尔产品的意思是,所有值为610462的EMM_ID将获得ID_Home值80100。相反,我只希望第一个EMM_ID 610462获得值80100,其余EMM_ID 610462应该为NaN。我希望我现在明白了,这很难解释。非常感谢。
   EMM_ID  colkey  ID_home
0  610462       0  81000.0
1  610462       1      NaN
2  610462       2      NaN
3  610462       3      NaN
4   61000       0     18.0
5   61000       1      NaN