【问题标题】:How to merge two dataframes with different lengths in python如何在python中合并两个不同长度的数据框
【发布时间】:2021-02-24 15:24:01
【问题描述】:

我正在尝试合并两个很好的 DateFrame,它们分别由一列组成,但长度不同。

能否请我知道如何合并它们,保持“周”索引?

[df1]

Week              Coeff1      
1               -0.456662
1               -0.533774
1               -0.432871
1               -0.144993
1               -0.553376
...                   ...
53              -0.501221
53              -0.025225
53               1.529864
53               0.044380
53              -0.501221
[16713 rows x 1 columns]

[df2]

Week               Coeff    
1                 0.571707
1                 0.086152
1                 0.824832
1                -0.037042
1                 1.167451
...                    ...
53               -0.379374
53                1.076622
53               -0.547435
53               -0.638206
53                0.067848
[63265 rows x 1 columns]

我试过这段代码:

df3 = pd.merge(df1, df2, how='inner', on='Week')
df3 = df3.drop_duplicates()
df3

但它给了我一个 13386431 行 × 2 列的新 df (df3)

期望的结果:一个新的 df,它有 3 列(week、coeff1、coeff2),因为 df2 更长,我希望 coeff1 中有一些 NaN 来填补空白。

【问题讨论】:

  • 使用您迄今为止尝试过的代码编辑帖子,以及为什么这还不够。
  • 请发布您尝试过的代码,概述您已经尝试过的资源
  • 简单的 pandas.merge 有什么问题?请描述您的问题
  • 使用pd.merge(df1,df2,on='Week',how='left')
  • 你想要的结果是什么?有很多方法可以合并两个数据框

标签: python pandas dataframe merge


【解决方案1】:

我假设你的输出应该是这样的:

Week Coeff1 Coeff2
1 -0.456662 0.571707
1 -0.533774 0.086152
1 -0.432871 0.824832
2 3 3
2 NaN 3

不过,不要介意实际数字。 问题是你不会通过在 Week 上的 join 来实现这一点,既不是 left 也不是 inner ,这是因为 Week-Index 不是唯一的。 因此,在左连接中,pandas 将在 df1 中 df1.Week == 1 的每一行上加入所有 Coeff2 值,其中 df2.Week == 1。这就是为什么你会得到数百万行。

稍后我会尝试为您提供解决方法,但也许这有助于您从另一个角度考虑这个问题!

现在是以后:

您真正想要做的是“每周”连接数据帧。 您可以通过每周迭代来实现这一点,创建一个 df_subset[week],通过 axis=1 连接 df1[week] 和 df2[week],然后在 axis=0 上连接所有这些子集:

weekly_dfs=[]
for week in df1.Week.unique():
    sub_df1 = df1.loc[df1.Week == week, "Coeff1"].reset_index(drop=True)
    sub_df2 = df2.loc[df2.Week == week, "Coeff2"].reset_index(drop=True)
    concat_df = pd.concat([sub_df1, sub_df2], axis=1)
    concat_df["Week"] = week
    weekly_dfs.append(concat_df)
df3 = pd.concat(weekly_dfs).reset_index(drop=True)

索引的最后一次重置是可选的,但我还是推荐它!

【讨论】:

  • 假设 df1.Week.unique() 等于 df2.Week.unique()。
  • @lukas-kaspraslukas 非常感谢您的投入。按照您的代码,我检索了 79889 行 × 3 列的 df3,而不是 63264 x 3。你知道我如何删除重复项吗?
  • 是的,我的错!我们必须为每个 sub_df 重置索引,因为 pd.concat(.., axis=1) 将它们连接到索引上。这就是为什么我们希望 sub_df1 和 sub_df2 从 rowindex 0 开始(而不是数据可能具有的“旧”rowindex)。我编辑了代码;它现在应该可以正常工作了!
  • 行得通!非常感谢,卢卡斯!干得好:)
【解决方案2】:

根据您对该问题的最后评论,您可能希望连接而不是合并两个数据框:

df3 = pd.concat([df1,df2], ignore_index=True, axis=1)

生成的DataFrame 应该有63265 行,并且需要一些工作才能使其达到所需的格式(删除添加的索引列,重命名剩余的列等),但pd.concat 应该是一个不错的选择开始。

【讨论】:

  • 非常感谢,但我的笔记本电脑正在努力执行任务
【解决方案3】:

根据pandas的mergedocumentation,你可以这样使用merge:

您正在寻找的是左连接。但是,默认选项是内部联接。您可以通过传递不同的方式参数来更改此设置:

df2.merge(df1,how='left', left_on='Week', right_on='Week')

请注意,这会将这些行保留在较大的 df 中,并在与较短的 df 合并时将 NaN 分配给它们。

【讨论】:

  • 假设“Week”是两个数据框之间唯一的共享列,您实际上不必传递“left_on”或“right_on”。 Pandas 将找到匹配的列并自动加入。如果有多个共享列,则只需调用 on='Week',与调用 left_on 和 right_on 相同
猜你喜欢
  • 2018-12-04
  • 1970-01-01
  • 2019-03-08
  • 2018-10-02
  • 2021-11-30
  • 2021-11-19
  • 2019-02-27
  • 2021-04-27
  • 1970-01-01
相关资源
最近更新 更多