首页 > 解决方案 > 如何将第一个数据框中的列与第二个数据框中的列进行比较,并在匹配时从第二个数据框中的另一列中提取值

问题描述

考虑我有一个数据框:

a = [['A','def'],['A','xyz'],['A','uiu'], ['B','jkl'], ['C','pqr'], ['C','rty']]
df1 = pd.DataFrame(a, columns=['1', '2'])

    1   2
0   A   def
1   A   xyz
2   A   uiu
3   B   jkl
4   C   pqr
5   C   rty

和另一个数据框:

a = [['A'], ['B'], ['C'],['D']]
df2 = pd.DataFrame(a, columns=['1'])



    1
0   A
1   B
2   C
3   D

我想将 df2 中的列“1”与 df1 中的列“1”进行比较,如果它们匹配,我希望得到一个结果数据框,其中包含与“|”连接的列“2”的值 (如果有多个匹配项)。例如,上面两个数据帧的结果应该是这样的:

    1   2
0   A   def|xyz|uiu
1   B   jkl
2   C   pqr|rty
3   D   NaN

标签: pythonpandasdataframe

解决方案


DataFrame.merge与聚合一起使用join

df = df1.merge(df2, on='1').groupby('1')['2'].agg('|'.join).reset_index()
print (df)
   1            2
0  A  def|xyz|uiu
1  B          jkl
2  C      pqr|rty

编辑:对于添加 alo 不匹配的值,DataFrame.drop_duplicates用于列的唯一值1DataFrame.reindex添加缺失值:

df22 = df2.drop_duplicates(subset=['1'])
df = (df1.merge(df22, on='1')
         .groupby('1')['2']
         .agg('|'.join)
         .reindex(df22['1'])
         .reset_index())
print (df)
   1            2
0  A  def|xyz|uiu
1  B          jkl
2  C      pqr|rty
3  D          NaN

推荐阅读