如何按顺序合并 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
我有 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