【问题标题】:pandas dataframe merge at the end熊猫数据框最后合并
【发布时间】:2021-08-01 15:13:13
【问题描述】:

如何将两个数据框合并为一个,只保存不同的行?

我已经尝试(使用外连接)pd.join 和 .merge,但它们似乎与数据框列混淆,并且无法解决问题。

我的 df 看起来像:

Time (my index) | Open | High | Low | Close | Volume | indicator1 | Indicator2 | ...

我每 15 分钟下载一次新数据并将其保存在 df2 中,然后在 df1 中读取旧数据。

df2 有 df1 没有的行(按时间定义为索引),我希望可以将它们添加到 df2 的末尾。

例子:

DF1:

Time.................................Open.........High..........Low...........Close.........Volume

2021-07-22 07:00:00 32055.25 32145.09 31970.84 31977.06 111.789173

2021-07-22 07:15:00 31979.67 32002.25 31926.26 31986.9 65.247509

DF2:

Time.................................Open.........High..........Low...........Close.........Volume

2021-07-22 07:15:00 31979.67 32002.25 31926.26 31986.9 65.247509

2021-07-22 07:30:00 31986.9 32030 31926.76 31942.18 62.549173

DF3:

Time.................................Open.........High..........Low...........Close.........Volume

2021-07-22 07:00:00 32055.25 32145.09 31970.84 31977.06 111.789173

2021-07-22 07:15:00 31979.67 32002.25 31926.26 31986.9 65.247509

2021-07-22 07:30:00 31986.9 32030 31926.76 31942.18 62.549173 

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    首先您可以与 external 和 indicator=True 合并(返回合并信息,例如,如果该值仅在右侧 df 上,仅在左侧 df 上,或在两者上

    merged = pd.merge(df1, df2, left_index=True, right_index=True, how='outer', indicator=True)
    

    然后,我们只想要 df2 上的差异(仅右)

    right_only = merged.query("_merge == 'right_only'").reset_index()['Time'].values == df2.reset_index()['Time'].values
    

    最后,我们将 df1 附加到 df2 的 right_only 值

    df3 = df1.append(df2[right_only])
    

    所以完整的代码是:

    merged = merge(df1, df2, left_index=True, right_index=True, how='outer', indicator=True)
    right_only = merged.query("_merge == 'right_only'").reset_index()['Time'].values == df2.reset_index()['Time'].values
    df3 = df1.append(df2[right_only])
    

    但就像@Tejas 提到的,你可以使用 concat:

    concatenate = pd.concat([df1, df2])
    df3 = concatenate.groupby(concatenate.index).first()
    

    【讨论】:

    • "right_only" 方法仍然输出奇怪的行,但"连接的 groupby" 工作完美,感谢支持:)
    【解决方案2】:

    试试这个

    df3 = pd.concat([df1,df2])
    df3.drop_duplicates(inplace=True)
    

    【讨论】:

    • 不,如果我将它保存到一个 excel 文件来读取数据,我可以看到它使行加倍,因此大小加倍。它存储数据帧,然后再次附加相同的数据帧,但索引为空白(时间)
    • 在 concat 之前对两个数据帧执行 reset_index(),如果这不起作用,请添加生成的数据帧的屏幕截图(df.head())
    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2018-02-02
    • 2017-06-11
    • 2016-01-01
    • 2016-10-31
    相关资源
    最近更新 更多