如何解决匹配多列而忽略熊猫的顺序
我有两个数据框
df = pd.DataFrame({'A': ['charlotte','bob','dave','alice'],'B': ['charlie','bridget','andy','diana','andy'],'outcome': ['yes','no','yes','yes']})
和
pairs= pd.DataFrame({'A': ['alice','charlie','dave'],'B': ['andy','charlotte','outcome_2': ['no','yes']})
请注意,行和列未对齐...
我想获得一个将outcome_1
和 outcome_2
对齐的数据框
我的解决方案是将各列转换为set
,然后进行比较:
df['combined']=[set(i) for i in df[['A','B']].values.tolist()]
A B outcome combined
0 charlotte charlie yes {charlie,charlotte}
1 bob bridget no {bridget,bob}
2 dave andy yes {dave,andy}
3 dave diana no {diana,dave}
4 alice andy yes {andy,alice}
pairs['combined']=[set(i) for i in pairs[['A','B']].values.tolist()]
A B outcome combined
0 alice andy no {andy,alice}
1 bridget bob yes {bridget,bob}
2 charlie charlotte no {charlie,charlotte}
3 diana dave no {diana,dave}
4 dave andy yes {dave,andy}
idxs=[np.where(pairs['combined']==i)[0][0] for i in df['combined']]
final=pd.DataFrame({'outcome_1':[df['outcome'][i] for i in idxs],'outcome_2':[pairs['outcome'][i] for i in idxs]})
最终:
outcome_1 outcome_2
0 yes no
1 no yes
2 yes yes
3 no no
4 yes no
如何有效地做到这一点?理想情况下,代码将首先对列['A','B']进行排序,以使它们都对齐。
解决方法
让我们尝试np.sort
对列进行水平排序并合并:
def align(df,columns=['A','B']):
ret = df.copy()
ret[columns] = np.sort(df[columns])
return ret
pd.merge(align(df),align(pairs),on=['A','B'])[['outcome','outcome_2']]
输出:
outcome outcome_2
0 yes no
1 no yes
2 yes yes
3 no no
4 yes no
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。