【问题标题】:Pandas: Merging multiple dataframes efficientlyPandas:有效地合并多个数据帧
【发布时间】:2021-07-13 21:26:48
【问题描述】:

我有一种情况需要合并多个数据帧,我可以使用以下代码轻松完成:

# Merge all the datasets together
df_prep1 = df_prep.merge(df1,on='e_id',how='left')
df_prep2 = df_prep1.merge(df2,on='e_id',how='left')
df_prep3 = df_prep2.merge(df3,on='e_id',how='left')
df_prep4 = df_prep3.merge(df_4,on='e_id',how='left')
df_prep5 = df_prep4.merge(df_5,on='e_id',how='left')
df_prep6 = df_prep5.merge(df_6,on='e_id',how='left')

但我想了解的是,如果有任何其他有效的方法来执行此合并,也许使用辅助函数?如果是,那我怎么能做到这一点?

【问题讨论】:

  • 这取决于您的数据框...是否相同的列?没有他们每个人的样本,很难回答。
  • 我在这里想问的是,是否有一种有效的方法来编写辅助函数并将所有这些数据合并语句传递给它。我相信,只要我正确创建了最终输出,所有列合并的内容并不重要。还是我在这里遗漏了什么?
  • 始终避免类似结构的对象(如数字后缀集)淹没全局环境。使用listdict 容器进行管理和组织。

标签: pandas dataframe merge


【解决方案1】:

您可以使用来自functools 模块的reduce 来合并多个数据帧:

from functools import reduce

dfs = [df_1, df_2, df_3, df_4, df_5, df_6]

out = reduce(lambda dfl, dfr: pd.merge(dfl, dfr, on='e_id', how='left'), dfs)

【讨论】:

    【解决方案2】:

    您可以将所有 dfs 放入一个列表中,或从函数、循环等传递它们,然后将所有内容合并到 1 个主 df 中。

    您可以从一个空的 df 开始并迭代。在您的情况下,由于您正在进行左合并,看起来您的 df_prep 应该已经具有您想要的所有 e_id 值。您需要弄清楚您想对任何其他列做什么,例如,您可以让 pandas 在您不合并的冲突列名之后添加 _x 和 _y,或重命名它们等。请参阅这个玩具示例:

    main_df = pd.DataFrame({'e_id': [0, 1, 2, 3, 4]})
    
    for x in range(3):
        dfx = pd.DataFrame({'e_id': [x], 'another_col' + str(x): [x * 10]})
        main_df = main_df.merge(dfx, on='e_id', how='left')
    

    得到:

       e_id  another_col0  another_col1  another_col2
    0     0           0.0           NaN           NaN
    1     1           NaN          10.0           NaN
    2     2           NaN           NaN          20.0
    3     3           NaN           NaN           NaN
    4     4           NaN           NaN           NaN
    

    【讨论】:

    • 避免使用mergeconcat 等方法在循环中增长对象。这可能导致quadratic copy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 2020-09-28
    • 2016-01-19
    相关资源
    最近更新 更多