合并两个共享相同列值的数据框

merge two dataframe that share the same column value

我有两个数据框 df1 =

C L O D LN M x y z w
FR 312 73 2021-04-09 1 W 1 0 0 0
FR 312 73 2021-04-09 1 W 0 1 0 0
FR 312 73 2021-04-09 1 W 0 0 1 0
FR 312 73 2021-04-09 3 W 1 0 0 0
FR 312 73 2021-04-09 3 W 0 1 0 0
FR 312 73 2021-04-09 3 W 0 0 1 0
FR 312 73 2021-04-09 4 W 1 0 0 0
FR 312 73 2021-04-09 4 W 0 1 0 0
FR 312 73 2021-04-09 4 W 0 0 1 0
FR 312 73 2021-04-09 5 W 1 0 0 0
FR 312 73 2021-04-09 5 W 0 1 0 0

df2=

C L O D LN M x y z w
FR 312 73 2021-04-09 1 L 1 0 0 1

我想在 C 上连接或合并这 2 个 df |大号 |欧 | D | LN

所需输出=

C L O D LN M x y z w
FR 312 73 2021-04-09 1 W 1 0 0 0
FR 312 73 2021-04-09 1 W 0 1 0 0
FR 312 73 2021-04-09 1 W 0 0 1 0
FR 312 73 2021-04-09 1 L 0 0 0 1

感谢您的帮助

正如我试图在评论中指出的那样,一个可能的解决方案是:

  • 复制 df2,并删除不需要的列(用于合并)
  • df2_duplidf1
  • 上使用内部合并
  • 可能删除 Nan 行,不确定是否需要此步骤
  • 合并 df2df_merge(concat)
  • 利润
# initialize
df1 = pd.DataFrame(data={'A': [1, 2, 3], 'B': ["abc", "abc", "cde"], 'C': [0, 1, 0]})
df2 = pd.DataFrame(data={'A': [1, 2], 'B': ["abc", "abc"], 'C': [5, 5]})

# duplicate and drop
df2_dupli = df2.copy()
df2_dupli = df2_dupli.drop(columns=['C'])

# inner merge
df_merge = pd.merge(df1, df2_dupli,  how='inner', left_on=['A','B'], right_on = ['A','B'])

# combine
df_out = pd.concat([df_merge, df2])
>>> df1
   A    B  C
0  1  abc  0
1  2  abc  1
2  3  cde  0

>>> df2
   A    B  C
0  1  abc  5
1  2  abc  5

>>> df_out
   A    B  C
0  1  abc  0
1  2  abc  1
0  1  abc  5
1  2  abc  5

df_out 现在包含 df2 中的所有行,以及 df1 中指定列中与 df2.

具有相同值的行

您可以设置索引,使其与您要匹配的数据对齐:

df1.set_index(['C','L','O','D','LN'], inplace=True) 
df2.set_index(['C','L','O','D','LN'], inplace=True) 

然后你可以将两个 dfs 合并成一个包含所有记录的 df

df_concat = pd.concat([df1, df2], axis=0)

剩下的就是找到存在于两个数据帧中的索引,并将其用于连接的 df:

i2keep = set(df1.index.tolist()) and set(df2.index.tolist())
df_concat.loc[i2keep,:].reset_index()

产量

    C    L   O         D  LN  M  x  y  z  w                                                                             
0  FR  312  73  4/9/2021   1  W  1  0  0  0                                                                             
1  FR  312  73  4/9/2021   1  W  0  1  0  0                                                                             
2  FR  312  73  4/9/2021   1  W  0  0  1  0                                                                             
3  FR  312  73  4/9/2021   1  L  1  0  0  1