python - Pandas 基于不同的列加入数据框
问题描述
我一直在尝试使用此链接中提到的 reduce() 函数合并多个数据帧pandas 三向连接列上的多个数据帧。
dfs = [df0, df1, df2, dfN]
df_final = reduce(lambda left,right: pd.merge(left,right,on='name'), dfs)
但是,在我的情况下,相关数据框的连接列是不同的。因此,我需要在每次合并时使用不同的 left_on 和 right_on 值。
我想出了一个解决方法,它在任何方面都不是高效或优雅的,但现在它可以工作。我想知道使用 reduce() 是否可以实现相同的目标,或者可能是其他有效的替代方案。我预见到我需要加入许多数据框。
import pandas as pd
...
...
# xml files - table1.xml, table2.xml and table3.xml are converted to <dataframe11>, <dataframe2>, <dataframe3> respectively.
_df = {
'table1' : '<dataframe1>',
'table2' : '<dataframe2>',
'table3' : '<dataframe3>'
}
# variable that tells column1 of table1 is related to column2 of table2, which can be used as left_on/right_on while merging dataframes
_relationship = {
'table1': {
'table2': ['NAME', 'DIFF_NAME']},
'table2': {
'table3': ['T2_ID', 'T3_ID']}
}
def _join_dataframes(_rel_pair):
# copy
df_temp = dict(_df)
for ele in _rel_pair:
first_table = ele[0]
second_table = ele[1]
lefton = _onetomany[first_table][second_table][0]
righton = _onetomany[first_table][second_table][1]
_merged_df = pd.merge(df_temp[first_table], df_temp[second_table],
left_on=lefton, right_on=righton, how="inner")
df_temp[ele[1]] = _merged_df
return _merged_df
# I have come up with this structure based on _df.keys()
_rel_pair = [['table1', 'table2'], ['table2', 'table3']]
_join_dataframes(_rel_pair)
解决方案
为什么不先重命名所有数据框的列?
df0.rename({'commonname': 'old_column_name0'}, inplace=True)
.
.
.
.
dfN.rename({'commonname': 'old_column_nameN'}, inplace=True)
dfs = [df0, df1, df2, ... , dfN]
df_final = reduce(lambda left,right: pd.merge(left,right,on='name'), dfs)
推荐阅读
- postgis - postgis中的最近邻搜索给出错误的结果
- apache-flink - 如何使用 flink-streaming 生成断电警报
- c++ - 如何在不使用属性的情况下指定对象
- polymer - zecat 的聚合物组件纸步进器存在后退导航问题
- php - 如何根据用户位置发送通知 oneSignal
- windows - 当字符串中有括号时如何用子字符串替换字符串
- docker - 来自守护进程的错误响应:获取 https://quay.io/v2/:未授权:未授权访问所请求的资源
- python - 带有python列表的FIXED If语句
- python - 如何更改 Django 管理员的用户添加页面选项卡的标题?
- loopbackjs - 环回 cli 3:lb:找不到命令 - Windows