python - 从 2 个 DataFrame 合并到 1 个
问题描述
我已经写了下面的代码。它有效,但我确信我可以做得更清晰,更快。
这个想法是:
- 我有 2 个输入数据帧,我想要 1 个数据帧作为输出。
- DF1 就像名称、属性 1、属性 2、属性 3、...
- 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', 'B', 'B', 'A'],
'Pair_2': ['B', 'C', 'A', 'C'],
'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, df2, 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', 'B', 'B', 'A'], 'Pair_2': ['B', 'C', 'A', 'C'],
'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
推荐阅读
- android - FusedLocationProviderClient 与以正确方式实现的 GoogleApiClient 相比是否提供了一些性能优势?
- python - 如何循环通过 Keras 拟合函数?
- nlp - 在整个语料库上训练词向量?
- orbeon - 如何从 Orbeon XForms 操作中调用 JavaScript 代码?
- git - git 创建远程分支而不破坏任何现有分支
- python - 在 raspbian OS 上的 python 3.5.3 上安装 opencv
- excel - 在 Excel 中 - 如何计算多个工作表上的多个下拉项目和数量
- ms-access - 将 MS Access 表中的值分配给变量
- vue.js - 推送路由(从 vueJS 移动到 nuxtJS)
- azure - 只有 RDP 从本地局域网工作到站点 2 站点 IPSEC 的天蓝色