Pythonpandas – 通过匹配主标识符将多个dataframe中的数据添加到同一行,如果没有来自该数据框的结果,则保留空白

对于python和使用pandas来说,这是一个很新的东西,我只是偶尔使用它,当我试图学习和自动化一个繁琐的Excel任务时。 我遇到了一个问题,我一直无法通过Google或Stack Overflowfind我要查找的内容。

我目前有6个不同的excel(.xlsx)文件,我可以parsing并读入数据框。 然而,每当我试图将它们追加在一起,他们只是作为新的行添加在最终输出excel文件,而是我试图将类似的数据值追加到同一行,而不是相同的列,使我可以看出这些数据集中是否出现这个唯一值。 缩短的例子如下

[df1] 0 Col1 Col2 1 XYZ 41235 2 OAIS 15123 3 ABC 48938 [df2] 0 Col1 Col2 1 KFJ 21493 2 XYZ 43782 3 SHIZ 31299 4 ABC 33347 [Expected Output] 0 Col1 [df1] [df2] 1 XYZ 41235 43782 2 OAIS 15123 3 ABC 48938 33347 4 KFJ 21493 5 SHIZ 31299 

我试过使用合并,但是实际的数据表要复杂得多,我想在每个数据集中追加与每个唯一标识符关联的23列数据。 比如[df2]中的[XYZ]在后面的23列中有关联的信息,我想在[df1]中的[XYZ]值的23列之后追加。

我应该怎么做呢? 每个Excel表格中大约有200行,我只需要循环,直到在[df1]中find与[df1]匹配的唯一标识符,然后在[df1]中find[df3],直到[df6]并将这些列附加到一个新的数据框,最终将输出为一个新的Excel文件。

 df1 = pd.read_excel("set1.xlsx") df2 = pd.read_excel("set2.xlsx") df3 = pd.read_excel("set3.xlsx") df4 = pd.read_excel("set4.xlsx") df5 = pd.read_excel("set5.xlsx") df6 = pd.read_excel("set6.xlsx") 

目前我正在阅读excel文件到数据框架,我确信我可以循环它,但是,我不确定这样做的最佳做法,而不是硬编码dataframe的每个初始化。

你需要合并参数how ='outer'

 new_df = df1.merge(df2, on = 'Col1',how = 'outer', suffixes=('_df1', '_df2')) 

你得到

  Col1 Col2_df1 Col2_df2 0 XYZ 41235.0 43782.0 1 OAIS 15123.0 NaN 2 ABC 48938.0 33347.0 3 KFJ NaN 21493.0 4 SHIZ NaN 31299.0 

对于迭代合并,考虑将dataframe存储在列表中,然后使用reduce()运行链合并。 下面通过Excel文件创build列表理解的数据框列表,其中enumerate()用于将Col2依次重命名为df1df2等。

 from functools import reduce ... dfList = [pd.read_excel(xl).rename(columns={'Col2':'df'+str(i)}) for i,xl in enumerate(["set1.xlsx", "set2.xlsx", "set3.xlsx", "set4.xlsx", "set5.xlsx", "set6.xlsx"])] df = reduce(lambda x,y: pd.merge(x, y, on=['Col1'], how='outer'), dfList) # Col1 df1 df2 # 0 XYZ 41235.0 43782.0 # 1 OAIS 15123.0 NaN # 2 ABC 48938.0 33347.0 # 3 KFJ NaN 21493.0 # 4 SHIZ NaN 31299.0 

或者,在需要将Col1设置为索引的情况下,使用pd.concat和outer连接数据pd.concat

 dfList = [pd.read_excel(xl).rename(columns={'Col2':'df'+str(i)}).set_index('Col1') for i,xl in enumerate(["set1.xlsx", "set2.xlsx", "set3.xlsx", "set4.xlsx", "set5.xlsx", "set6.xlsx"])] df2 = pd.concat(dfList, axis=1, join='outer', copy=False)\ .reset_index().rename(columns={'index':'Col1'}) # Col1 df1 df2 # 0 ABC 48938.0 33347.0 # 1 KFJ NaN 21493.0 # 2 OAIS 15123.0 NaN # 3 SHIZ NaN 31299.0 # 4 XYZ 41235.0 43782.0 

您可以使用合并function。

 pd.merge(df1, df2, on=['Col1']) 

您可以通过添加到列表on使用多个键。

你可以在这里阅读更多关于合并function

如果您只需要某些列,您可以通过以下方式访问:

 df1.merge(df2['col1','col2']], on=['Col1']) 

编辑:

在循环某些df的情况下,您可以循环遍历除第一个以外的所有df,并将它们全部合并:

 df_list = [df2, df3, df4] for df in df_list: df1 = df1.merge(df['col1','col2']], on=['Col1'])