Python Pandas通过匹配主标识符将来自多个数据帧的数据追加到同一行,如果该数据帧没有结果,则留空

2024-03-29 14:30:58 发布

您现在位置:Python中文网/ 问答频道 /正文

对于python和pandas非常陌生,我只在尝试学习和自动化乏味的Excel任务时偶尔使用它。我遇到了一个问题,我不能通过Google或这里的Stack Overflow找到我要找的东西。在

我目前有6个不同的excel(.xlsx)文件,我可以分析和读取到数据帧。但是,每当我尝试将它们追加到一起时,它们只是作为新行添加到最终输出的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行,我只需要在[df2]和[df1]中找到一个匹配的唯一标识符,然后用[df1]找到[df3],以此类推,直到[df6]为止,并将这些列附加到一个新的数据帧上,该数据帧最终将作为新的excel文件输出。在

^{pr2}$

是目前我将excel文件读入数据帧的方式,我确信我可以循环它,但是,我不确定这样做的最佳实践,而不是硬编码数据帧的每个初始化。在


Tags: 文件数据信息pandas标识符excelcol2col1
3条回答

您需要使用参数how='outer'合并

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

你得到了

^{pr2}$

您可以使用合并功能。在

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

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

您可以在here中阅读有关merge函数的更多信息

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

^{pr2}$

编辑:

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

df_list = [df2, df3, df4]

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

对于迭代合并,考虑在列表中存储数据帧,然后使用reduce()运行链合并。下面通过Excel文件从列表理解创建一个数据帧列表,其中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

或者,使用pd.concat并在需要将Col1设置为索引的地方水平连接数据帧:

^{pr2}$

相关问题 更多 >