Pandas 在特定行和列处向现有数据帧添加数据帧

Pandas 在特定行和列处向现有数据帧添加数据帧,pandas,dataframe,append,row,concat,Pandas,Dataframe,Append,Row,Concat,我有一个循环,每次都用一个表单创建一个数据帧(DF) DF 然后使用以下表单将该数据帧添加到现有数据帧(main_exl_df): 主接线盒exl接线盒df ID Date ... COGOTH3 COGOTH3X COGOTH3F 0 d0129 NaN ... NaN NaN NaN 1 d0757 NaN ... 0.0 NaN NaN 2 d2430

我有一个循环,每次都用一个表单创建一个数据帧(DF)

DF

然后使用以下表单将该数据帧添加到现有数据帧(main_exl_df):

主接线盒exl接线盒df

         ID  Date     ... COGOTH3  COGOTH3X COGOTH3F
0     d0129   NaN    ...     NaN       NaN      NaN
1     d0757   NaN    ...     0.0       NaN      NaN
2     d2430   NaN    ...     NaN       NaN      NaN
3     d3132   NaN    ...     0.0       NaN      NaN
4     d0371   NaN    ...     0.0       NaN      NaN
                 ...   ...       ...  ...     ...       ...      ...
2163  d0620   NaN    ...     0.0       NaN      NaN
2164  d2410   NaN    ...     0.0       NaN      NaN
2165  d0752   NaN    ...     NaN       NaN      NaN
2166  d0407   NaN    ...     0.0       NaN      NaN
在每次迭代中,保存main_exl_df,然后为下一次迭代再次加载

我试过了

main_exl_df = pd.concat([main_exl_df, DF], axis=1)
但是每次都会将列添加到main_exl_df的右侧,如果'ID'行,则无法识别索引


如何指定在具有正确ID和正确列的行中添加新的数据帧(DF)?

在这种情况下,合并是合并列的方法。使用pd.merge时,需要指定合并是内部合并、左合并还是右合并。假设在这种情况下,您希望保留main_exl_df中的所有行,则应使用以下方法合并:

main_exl_df = main_exl_df.merge(DF, how='left', on='ID')
如果要保留两个数据帧中的行,请使用
outer
作为参数值:

main_exl_df = main_exl_df.merge(DF, how='outer', on='ID')

这就是最终解决问题的方法(借助于):

我使用了merge函数,但是merge创建了带有x和y后缀的重复列。为了去掉x后缀,我使用了以下函数:

    def drop_x(df):
        # list comprehension of the cols that end with '_x'
        to_drop = [x for x in df if x.endswith('_x')]
        df.drop(to_drop, axis=1, inplace=True)
然后合并两个数据帧,同时用空字符串替换_y后缀:

    col_to_use = DF.columns.drop_duplicates(main_exl_df)
    main_exl_df = main_exl_df.merge(DF[col_to_use], on='ID', how='outer', suffixes=('_x', ''))
    drop_x(main_exl_df)

我也尝试了
main\u exl\u df=pd.merge(main\u exl\u df,df,on=main\u exl\u df.columns[0])
来识别正确的ID,但是当我保存main\u exl\u df时,只保存了一行,其余的列和行都丢失了。谢谢。这修复了merge未保存所有行的问题,并且还可以识别合并右侧“ID”行上的两个数据帧。然而,
how='left'
how='outer'
的两个选项都有相同的输出,在每次合并时都会创建新列(从带有_x后缀的main_exl_df和带有_y后缀的df)。为了修复它,我尝试了以下方法:
main\u exl\u df=main\u exl\u df.merge(df,how='outer',on=columns\u label)
其中
columns\u label
是来自两个数据帧的所有相互列标签的列表。但这也不能解决问题。@ReiRei这意味着数据帧中还有其他公共列。要解决这个问题,您可以合并所有公共列,而不仅仅是“ID”列。另外,签出()可以在合并时删除重复的列。非常感谢您的回答。我使用了你发送的链接来解决问题。我对你的答案投了更高的票,但不幸的是,它不会公开显示,因为我的声誉现在还不到15。
    col_to_use = DF.columns.drop_duplicates(main_exl_df)
    main_exl_df = main_exl_df.merge(DF[col_to_use], on='ID', how='outer', suffixes=('_x', ''))
    drop_x(main_exl_df)