如何在python中合并两个长度不同的数据帧

2024-04-19 01:23:48 发布

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

我正在尝试合并两个weelly日期框,每个日期框由一列组成,但长度不同

我可以知道如何合并它们,维护“周”索引吗

[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

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

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


Tags: columns代码dfmergerowspddf1df2
3条回答

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

^{tb1}$

不过,不要介意实际数字。 问题是,如果在周上进行联接(无论是左联接还是内联接),就无法实现这一点,这是因为周索引不是唯一的。 因此,在左连接上,pandas将在df1中的每一行上连接所有Coeff2值,其中df1.Week==1。这就是为什么会有数百万行

稍后我会尝试给你一个解决方法,但也许这有助于你从另一个角度思考这个问题

现在是晚些时候:

实际上,您要做的是“每周”连接数据帧。 通过每周迭代,创建一个df_子集[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)

最后一次重置索引是可选的,但我还是建议您这样做

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

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

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

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

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

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

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

相关问题 更多 >