首页 > 解决方案 > 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)

标签: pythonpython-3.xpandas

解决方案


为什么不先重命名所有数据框的列?

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)

推荐阅读