如何解决从 2 个 DataFrame 合并到 1 个熊猫
我写了下面的代码。 它有效,但我相信我可以做得更清晰、更快。
这个想法是: 我有 2 个输入数据帧,我想要 1 个数据帧作为输出。 DF1 就像 Name,Attribute1,Attribute2,Attribute3,... DF2 就像 Name1,Name2,Value1,Value2
我希望,对于 DF2 的每一行,NameX 都被 DF1 中的属性列表替换。
有人可以“清理”我的代码并向我学习一些好的做法吗? 谢谢
import pandas as pd
# dictionary 1
dico_1 = {
'Name': ['A','B','C'],'Attr1': ['XXX','YYY','XXX'],'Attr2': ['YYY','ZZZ','YYY'],}
dico_2 = {
'Pair_1': ['A','A'],'Pair_2': ['B','C','A','V1': ['V1_AB','V1_BC','V1_BA','V1_AC'],'V2': ['V2_AB','V2_BC','V2_BA','V2_AC']
}
df1 = pd.DataFrame(dico_1)
df2 = pd.DataFrame(dico_2)
def cons(df1,df2,row):
P1 = df2['Pair_1'][row]
P2 = df2['Pair_2'][row]
tmp1 = df1.loc[df1['Name'] == P1,"Attr1":"Attr2"]
tmp2 = df1.loc[df1['Name'] == P2,"Attr1":"Attr2"]
tmp3 = pd.DataFrame(df2.loc[row,"V1":"V2"]).transpose()
tmp1.reset_index(drop=True,inplace=True)
tmp2.reset_index(drop=True,inplace=True)
tmp3.reset_index(drop=True,inplace=True)
tmp1 = tmp1.add_suffix('_Pair1')
tmp2 = tmp2.add_suffix('_Pair2')
a = pd.concat([tmp1,tmp2,tmp3],axis=1)
return a
df3 = pd.DataFrame(index=range(df2.shape[0]),columns=['Attr1_Pair1','Attr2_Pair1','Attr1_Pair2','Attr2_Pair2','V1','V2'])
for row in range(df2.shape[0]):
line = cons(df1,row)
df3.loc[row] = line.iloc[0]
df3
解决方法
让我们尝试两个合并:
import pandas as pd
dico_1 = {'Name': ['A','B','C'],'Attr1': ['XXX','YYY','XXX'],'Attr2': ['YYY','ZZZ','YYY'],}
dico_2 = {'Pair_1': ['A','A'],'Pair_2': ['B','C','A','V1': ['V1_AB','V1_BC','V1_BA','V1_AC'],'V2': ['V2_AB','V2_BC','V2_BA','V2_AC']}
df1 = pd.DataFrame(dico_1)
df2 = pd.DataFrame(dico_2)
# Merge with DF1 on Pair_1 then Merge again with DF1 on Pair_2
df3 = df2.merge(df1,left_on='Pair_1',right_on='Name') \
.merge(df1,left_on='Pair_2',right_on='Name',suffixes=('_Pair1','_Pair2'))
# Drop Extra Columns
df3 = df3.drop(columns=['Name_Pair1','Name_Pair2','Pair_1','Pair_2'])
print(df3)
df3:
V1 V2 Attr1_Pair1 Attr2_Pair1 Attr1_Pair2 Attr2_Pair2
0 V1_AB V2_AB XXX YYY YYY ZZZ
1 V1_BC V2_BC YYY ZZZ XXX YYY
2 V1_BA V2_BA YYY ZZZ XXX YYY
3 V1_AC V2_AC XXX YYY XXX YYY
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。