【问题标题】:Python pandas conditional logic/using where while merging dataframesPython pandas 条件逻辑/在合并数据帧时使用 where
【发布时间】:2021-04-23 01:29:02
【问题描述】:

我有这些 DF

df1

user_id     code     name     code_equivalence             name_equivalence
51          123    bi lovers            542                bi for marketing
51          123    bi lovers            545                i love bi
51          234    datascience          345                data and science
51          234    datascience          555                data lovers
51          255    antiquity history    429                roma
51          255    antiquity history    430                greece
52          123    bi lovers            542                bi for marketing
52          123    bi lovers            545                i love bi
52          256    modern history       500                france
52          256    modern history       501                germany
52          200    arts                 400                arts I
52          200    arts                 401                arts II

df2

user_id     code     name       status
51          123    bi lovers    ongoing
51          430    greece       ongoing
52          501    germany      ongoing
52          050    numbers      ongoing

我想通过检查 df2 代码是否与 df1 代码或 df1 code_equivalence 相同并且 df2 名称与 df1 名称或 df1 name_equivalence 相同来合并它们以获得 df2 状态。 像这样:

合并df

user_id     code     name               code_equivalence    name_equivalence        status
51          123    bi lovers            542                 bi for marketing        ongoing
51          123    bi lovers            545                 i love bi               ongoing
51          234    datascience          345                 data and science        (null)
51          234    datascience          555                 data lovers             (null)
51          255    antiquity history    429                 roma                    (null)
51          255    antiquity history    430                 greece                  ongoing
52          123    bi lovers            542                 bi for marketing        (null)
52          123    bi lovers            545                 i love bi               (null)
52          256    modern history       500                 france                  (null)
52          256    modern history       501                 germany                 ongoing
52          200    arts                 400                 arts I                  (null)
52          200    arts                 401                 arts II                 (null)

之后,我想将数据转换成一个新的df,如下所示:

最终结果

user_id     code     name               code_equivalence    name_equivalence                    status
51          123    bi lovers            [542, 545]          [bi for marketing, i love bi]       ongoing
51          234    datascience          [345, 555]          [data and science, data lovers]     (null)
51          255    antiquity history    [429, 430]          [roma, greece]                      ongoing
52          123    bi lovers            [542, 545]          [bi for marketing, i love bi]       (null)
52          256    modern history       [500, 501]          [france, germany]                   ongoing
52          200    arts                 [400, 401]          [arts I, arts II]                   (null)

谁能帮帮我?

【问题讨论】:

  • 确实的要求,但是到目前为止您遇到了什么问题? mergegroupby 是您完成此任务所需的正确工具。
  • 即使使用左连接,使用合并时我也会丢失 df1 唯一代码和名称
  • 你能检查一下你的 merge_df 的第 5 行吗?基于 df1 和 df2 我不认为应该有一个匹配,所以它不应该是(空)在状态列?我的意思是代码 = 255 和 name_eq = roma 的行。
  • @Michał89 是的,你是对的。它是空的

标签: python pandas merge conditional-statements


【解决方案1】:

这就是我通过三个步骤获得 merge_df 数据帧的方式:

  1. 在第一个条件下合并

  2. 在第二个条件下合并

  3. 用第 2 步中的匹配项填充第 1 步中缺少的匹配项。

    merge_df = pd.merge(df1, df2[["code","status"]], left_on=["code"], right_on=["code",], how="left")
    merge_df2 = pd.merge(df1, df2[["code","status"]], left_on=["code_equivalence"], right_on=["code",], how="left")
    merge_df["status"].fillna(merge_df2["status"], inplace=True)
    

但是我想知道是否有单线可以做到这一点(可能是的)。

【讨论】:

    【解决方案2】:

    不确定我的提问是否正确,但根据我读到的内容,您进行了合并,现在您希望获得final result?如果是这样,那应该可以完成这项工作,考虑到 merged 是您的合并数据框。

     >>> merged.groupby(['user_id','code','name']).agg(list).reset_index()
       user_id  code               name code_equivalence                 name_equivalence              status
    0       51   123          bi lovers       [542, 545]    [bi for marketing, i love bi]  [ongoing, ongoing]
    1       51   234        datascience       [345, 555]  [data and science, data lovers]    [(null), (null)]
    2       51   255  antiquity history       [429, 430]                   [roma, greece]   [(null), ongoing]
    3       52   123          bi lovers       [542, 545]    [bi for marketing, i love bi]    [(null), (null)]
    4       52   200               arts       [400, 401]                [arts I, arts II]       [(null), nan]
    5       52   256     modern history       [500, 501]                [france, germany]   [(null), ongoing]
    

    无论如何,如果您只有df1df2,这就是完整的解决方案:

     >>> (pd
         ...: .merge(df1,df2, left_on=['user_id','code','name'], right_on=['user_id','code','name'], how='left')
         ...: .groupby(['user_id','code','name'])
         ...: .agg(list)
         ...: .reset_index())
    
       user_id  code               name code_equivalence                 name_equivalence              status
    0       51   123          bi lovers       [542, 545]    [bi for marketing, i love bi]  [ongoing, ongoing]
    1       51   234        datascience       [345, 555]  [data and science, data lovers]          [nan, nan]
    2       51   255  antiquity history       [429, 430]                   [roma, greece]          [nan, nan]
    3       52   123          bi lovers       [542, 545]    [bi for marketing, i love bi]          [nan, nan]
    4       52   200               arts       [400, 401]                [arts I, arts II]          [nan, nan]
    5       52   256     modern history       [500, 501]                [france, germany]          [nan, nan]
    

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 2017-12-30
      • 1970-01-01
      • 2022-01-20
      • 2017-08-07
      • 2017-10-11
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多