【问题标题】:pandas Dataframe Concat/Upsert on a Combination Key组合键上的 pandas Dataframe Concat/Upsert
【发布时间】:2021-07-02 14:13:51
【问题描述】:

假设我有以下数据集

ID | Name | balance | Year
112 Johnstown $321 2020
321 Oregon $214 2020
121 Jackson $254 2020

以及以下传入的数据集

112 Johnstown $321 2021
321 Oregon $216 2020
121 Jackson $254 2020

我想做的是结合这两个数据集,同时保留季节性的概念。基本上,如果记录的年份以外的任何字段发生更改,请更新该记录。但是,如果记录的年份发生了变化,那就创造一个新的记录。

所以在我们的例子中,结果数据集看起来像这样

112 Johnstown $321 2021
112 Johnstown $321 2020
321 Oregon $216 2020
121 Jackson $254 2020

这本质上是一个 upsert 操作,我认为它是对 ID 和 season 组合键的 upsert。基本上,如果 ID 和季节相同,则更新现有记录,如果它们不同,则添加新记录。换句话说

  1. 如果记录完全相同,则什么也不做
  2. 如果记录不同但年份/ID 相同,则获取记录 来自新数据集

3.如果记录不同并且年份/id 是 不一样创造新纪录

数据框可以做到这一点吗?如果没有,我应该考虑另一种结构来实现它吗?我们的数据集只是 parquet 文件,因此我们可以随意操作它们

【问题讨论】:

    标签: python pandas dataframe parquet


    【解决方案1】:

    这是预期的输出吗?根据您的

    基本上,如果 ID 和季节相同,则更新现有的 记录,如果它们不同,则添加新记录。

    我们连接两个数据帧,按IDYear 分组,并在每个组中保留最后一个(因此来自df2)元素。

    >>> pd.concat([df1, df2]).groupby(["ID", "Year"], as_index=False).last()
        ID  Year       Name balance
    0  112  2020  Johnstown    $321
    1  112  2021  Johnstown    $321
    2  121  2020    Jackson    $254
    3  321  2020     Oregon    $216
    

    【讨论】:

    • 我想你已经明白了。是的,这里的想法基本上是我有一个现有的数据集和一个新的数据集。我想将两个数据集与以下逻辑结合起来 1. 如果记录完全相同,则什么也不做 2. 如果记录不同但年份/id 相同,则从新数据集中获取记录 3.如果记录不同和 year/id 不同创造新记录
    • 嘿 crayxt,它似乎没有用。我正在生成这样的数据框 outputDF = pd.concat([z2DF, z1DF]).groupby(["ID", "year"], as_index=False).last() 我知道 z1DF 中有更新的信息,但我得到的结果数据帧与开始时 z2DF 中的数据帧完全相同。
    • 请注意,我的数据框实际上有 15 列左右,不确定这是否会影响它。我不知道为什么没有任何变化,df1 中应该反映非分组变化
    • 搞定了!搞砸了我是如何获取数据的,再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 2019-05-03
    相关资源
    最近更新 更多