请帮助我解决这个特殊情况。我已经能够部分地做到这一点,但最终的数据框对于所有行来说看起来都不正确。
我有两个数据框:
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 |
如果两个 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