迭代多个数据帧的合并
Posted
技术标签:
【中文标题】迭代多个数据帧的合并【英文标题】:Iterating over a merge of multiple dataframes 【发布时间】:2020-11-22 21:45:07 【问题描述】:我正在尝试构建一个循环,该循环将采用单独的数据帧并在单个“主”数据帧上合并。
每个单独的数据框都出现故障,我想将它们与主数据框的 CAS 列中的值对齐。
示例主数据框
示例数据框 1:
示例数据框 2:
[]
实际数据
主数据帧
DataFrame1
DataFrame2
【问题讨论】:
理想情况下,我想将循环结果导出到单个 csv,其中 CAS 和 Value 与主数据框对齐。任何帮助表示赞赏! 在将包括 master 在内的所有 dfs 合并到列表设置CAS
作为每个索引后尝试 chain merge:pd.concat([df.set_index('CAS', drop=True) for df in [master] + dataframes], axis=1)
您应该在数据框列表中工作,而不是在全球环境中泛滥的单独对象。展示您如何定义 50 个单独的数据框。
我不知道你完整的 DataFrame 规范。它们包含哪些列?您希望在 DataFrame 中返回哪些列?可以为您的 DataFrame 结构提供图像以进行说明,但您的数据也需要在 Python 代码中提供。见How do I ask a good question?。
【参考方案1】:
解决方案 1:仅在 df1 和 df2 中使用 if 'value' 列,而不是 df_master。
dfcon = pd.concat([df1, df2])
df = pd.merge(df_master, dfcon, how='left', on='CAS')
解决方案 2:如果“值”列也在 df_master 中,则使用。
df_master_drop = df_master.drop(columns=['value'])
df_drop = pd.merge(df_master_drop, dfcon, how='left', on='CAS')
df = df_master.combine_first(df_drop)
注意事项: 如果有重复项,请使用 dfcon = pd.concat([df1, df2]).drop_duplicates('CAS')。这将保留最早的 CAS 值。
【讨论】:
【参考方案2】:编辑:更改代码以在任何 df 中包含不匹配的主条目
似乎一个简单的连接就可以完成这项工作(除非您想要保留更多的主数据):
result = (
pd.concat(dataframes.append(master_df), axis=0,
keys=[f'dfi' for i in range(1, len(dataframes)+1)], names=['source'])
.sort_values('CAS')
)
keys 参数是可选的,你肯定没有要求它。我包括它是因为它通常很有用。它将为结果 df 中的索引添加一个级别,以便您可以跟踪源或进行分组分析。
【讨论】:
是的,如果您也希望将 master 连接起来,那么您需要一个包含所有 dfs 的新列表。在这种情况下,连接许多 dfs 似乎是安全的。但是,如果 dfs 的列相差很大并且它们有很多行,那么您将得到一张 NaN。见***.com/a/49620539/6692898 这只是连接三个数据框并添加一个“源”列。我相信 Chris 想要加入数据帧 1 和 2 中的值以对应于 master 中的 CAS 编号(即将值列添加到 master df)。 刚刚进行了编辑。但是,这已经在评论中得到解决。 @Jakub 这个网站的目标是让人们帮助你弄清楚你是如何犯错的并指出可能的解决方案,而不是为你编写每一行代码。这次没问题,请记住。 现在我看到了对问题的编辑,它通过提出不同的问题通过连接来解决。现在您需要查看连接“dataframes”,然后与 master 合并(除非有可能在“dataframes”中的 dfs 中有重复的 CAS 代码,这会带来不同的问题) 我明白,我们都在某个时候学会使用该网站,而我不是多年的专家。别担心,我只是指出建议。以上是关于迭代多个数据帧的合并的主要内容,如果未能解决你的问题,请参考以下文章
R语言merge函数连接多个dataframe数据集迭代内连接dataframe数据( iteratively merge data frames in R)默认merge函数通过公共列名合并数据