【问题标题】:Adding a dataframe to an existing dataframe at specific rows and columns将数据框添加到特定行和列的现有数据框
【发布时间】:2020-12-09 23:20:19
【问题描述】:

我有一个循环,每次都会创建一个带有表单的数据框(DF)

DF

  ID        LCAR        RCAR  ...     LPCA1     LPCA2     RPCA2
0 d0129  312.255859  397.216797  ...  1.098888  1.101905  1.152332

然后使用此表单将该数据框添加到现有数据框(main_exl_df):

main_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)?

【问题讨论】:

  • 我也试过main_exl_df = pd.merge(main_exl_df, DF, on=main_exl_df.columns[0])来识别正确的ID,但是当我保存main_exl_df时,只保存了一行,其余的列和行都丢失了。

标签: pandas dataframe append row concat


【解决方案1】:

合并是在这种情况下合并列的方法。使用pd.merge时,需要指定合并是inner、left还是right。假设在这种情况下,您想保留 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')

【讨论】:

  • 谢谢。这解决了合并不保存所有行的问题,并且还可以识别合并右侧“ID”行上的两个数据框。但是,how='left'how='outer' 的两个选项具有相同的输出,每次合并都会创建新列(从带有 _x 后缀的 main_exl_df 和带有 _y 后缀的 DF)。为了解决这个问题,我尝试了这个:main_exl_df = main_exl_df.merge(DF, how='outer', on=columns_label) 其中columns_label 是两个数据帧中所有相互列标签的列表。但这也没有解决问题。
  • @ReiRei 这意味着您在数据框中也有其他常见的列。要解决此问题,您可以合并所有常用列,而不仅仅是“ID”列。此外,请查看 (stackoverflow.com/questions/19125091/…) 以在合并时删除重复的列。
  • 非常感谢您的回答。我使用您发送的链接来解决问题。我赞成您的回答,但不幸的是它不会公开显示,因为我的声誉现在不到 15。
【解决方案2】:

这就是最终解决问题的方法(在this answer的帮助下):

我使用了合并功能,但是合并创建了带有 _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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2016-03-28
    • 1970-01-01
    • 2017-09-16
    相关资源
    最近更新 更多