将一个 df 中的名称与另一个 df 进行拆分和匹配,并返回匹配的行

问题描述 投票:0回答:1

请帮助我解决这个特殊情况。我已经能够部分地做到这一点,但最终的数据框对于所有行来说看起来都不正确。

我有两个数据框:

df1:

姓名
A/B/C
D/E
F/G

df2:

名字 姓氏 公司名称
亚当 A 坚定1
哈利 B 坚定1
安德鲁 C 坚定1
迈克 A 坚定2
希拉 D 坚定3
哈希 E 坚定3
米歇尔 F 坚定4
莫蒂 G 坚定4

现在 df1 只包含带斜杠 (/) 的姓氏。我想将 df1 中的姓氏与 df2 进行匹配,当它找到所有 A、B 和 C 的通用公司名称时,例如,返回该行的公司名称。如果您注意到 df1 中的 A/B/C,则 df2 中的同一个姓氏有多个公司名称。我只想要该行中所有三个姓氏的共同公司名称。

所以我的最终数据框应该看起来像这样:

姓名 公司名称
A/B/C 坚定1
D/E 坚定2
F/G 坚定3
python pandas dataframe
1个回答
0
投票

如果两个 DataFrame 中

Last Names
的顺序相同,则可以使用:

out = df1[['Name']].merge((df1['Name'].str.split('/')
                                     .explode()
                                     .rename('Last Name')
                                     .reset_index()
                                     .merge(df2, how='left')
                                     .groupby(['index','Firm Names'])
                                     .agg(Name=('Last Name', '/'.join))
                                     .reset_index(level=1)), how='left')
print (out)
    Name Firm Names
0  A/B/C      Firm1
1    D/E      Firm3
2    F/G      Firm4

更通用的解决方案:

df11 = df1.assign(**{'Last Name':df1['Name'].str.split('/'),
                    'sets':lambda x: x['Last Name'].apply(frozenset)})
print (df11)
    Name  Last Name       sets
0  A/B/C  [A, B, C]  (B, A, C)
1    D/E     [D, E]     (D, E)
2    F/G     [F, G]     (F, G)

df22 =  (df11.explode('Last Name')
           .reset_index()
           .merge(df2, how='left')
           .groupby(['index','Firm Names'])
           .agg(sets=('Last Name', frozenset))
           .reset_index(level=1))
print (df22)
      Firm Names       sets
index                      
0          Firm1  (B, A, C)
0          Firm2        (A)
1          Firm3     (D, E)
2          Firm4     (F, G)

out = df11.merge(df22, how='left')[['Name','Firm Names']]
print (out)
    Name Firm Names
0  A/B/C      Firm1
1    D/E      Firm3
2    F/G      Firm4
© www.soinside.com 2019 - 2024. All rights reserved.