如何按顺序合并 2 个数据框

How to merge 2 dataframes with order

我有 2 个数据帧

df_My 看起来像这样

Seq    Grp
-----------
1      1
2      1
3      2
4      1
5      2
6      2
7      3
8      3
9      1
.
.
135    3
136    1
137    1
138    2
139    3

另一个数据框是df_Filer

df_Filer

Seq    Grp    Alg
-------------------
1      1      J
3      2      F
7      3      Z
136    1      M
137    1      R
138    2      T
139    3      Y

我想将两个数据帧合并为 1,其中

1- 如果 df_My 序列号已经在 df_Filer 中,那么它应该与那个数字合并 df_My 基于序列号在 df_My 和 df_Filter

2- 如果 df_My 序列号不在 df_Filer 中,那么它应该与同一个 Grp

中的最小序列号连接

所以最终结果应该如下

Seq    Grp    Alg
------------------
1      1      J
2      1      J
3      2      F
4      1      J
5      2      F
6      2      F
7      3      Z
8      3      Z
9      1      J
.
.
135    3      Z
136    1      M
137    1      R
138    2      T
139    3      Y

我试过了,但没有给我预期的结果

df_Out = df_My.merge(df_Filter, axis=1), on='Grp')

知道如何实现吗?

作为 ,您可以使用 merge_asof:

out = pd.merge_asof(df1, df2, on='Seq', by='Grp')

另一种选择是,您可以left-merge,然后使用groupby + idxmin为缺失值创建从Grp到Alg的映射,然后填充:

df_merged = df1.merge(df2, on='Seq', how='left', suffixes=('','_')).drop(columns=['Grp_'])
no_nan = df_merged.dropna()
mapping = df_merged['Grp'].map(no_nan.loc[no_nan.groupby('Grp')['Seq'].idxmin(), ['Grp','Alg']].set_index('Grp')['Alg'])
df_merged['Alg'] = df_merged['Alg'].fillna(mapping)

输出:

    Seq  Grp Alg
0     1    1   J
1     2    1   J
2     3    2   F
3     4    1   J
4     5    2   F
5     6    2   F
6     7    3   Z
7     8    3   Z
8     9    1   J
9   135    3   Z
10  136    1   M
11  137    1   R
12  138    2   T
13  139    3   Y