【问题标题】:Join two tables in pandas with some conditions in columns在 pandas 中加入两个表,列中有一些条件
【发布时间】:2021-11-15 22:55:08
【问题描述】:
Num Algo Distance Result
525 M 25 Good
524 M 28 Good
523 M 30 Good
522 M 75 Good
Num Algo Distance Result
525 T 25 Good
524 T 28 Bad
520 T 98 Good
df_1 = pd.DataFrame({'Num' : [525, 524, 523, 522], 'Algo' : [M, M, M, M], 'Distance' : [25, 28, 30, 75], 'Result' : ['Good', 'Good', 'Good', 'Good']})

df_2 = pd.DataFrame({'Num' : [525, 524, 520], 'Algo' : [T, T, T], 'Distance' : [25, 28, 98], 'Result' : ['Good', 'Bad', 'Good']})

我有两个如上所述的数据框,我想以如下方式加入/合并它们(我在 pandas 中尝试了不同的加入,但它没有按我的意愿工作):

Num Algo Distance Result
525 M, T 25 Good
524 M, T 28 Good
523 M 30 Good
522 M 75 Good
520 T 98 Good

另外,我想在加入时优先考虑df_1['Result'],因为可以看出我将'Good' 用于'Num' = 524

【问题讨论】:

  • 在结果栏中,你只有Good或Bad?并且聚合将是相等的 Num 和 Distance?
  • 在大多数情况下,它是Good或Bad,但有时它可能是Good,Bad在同一行。如果 Num 相同,则两个数据帧中的距离始终相同。

标签: python pandas join merge


【解决方案1】:

试试merge:

output = df_1.merge(df_2, on=["Num", "Distance"], how="outer")

#concat Algo columns from both dfs to a string
output["Algo"] = output["Algo_x"].fillna("").str.cat(output["Algo_y"].fillna(""), sep=", ").str.strip().str.strip(",")

#combine Result column using df_2 data only when df_1 is NaN
output["Result"] = output[["Result_x", "Result_y"]].ffill(axis=0)["Result_x"]
output = output[["Num", "Algo", "Distance", "Result"]]

>>> output
   Num  Algo  Distance Result
0  525  M, T        25   Good
1  524  M, T        28   Good
2  523     M        30   Good
3  522     M        75   Good
4  520     T        98   Good

【讨论】:

    【解决方案2】:

    IIUC,你可以在concat之后使用pandas.DataFrame.groupby

    df = pd.concat([df_1, df_2])
    new_df = df.groupby(["Num", "Distance"], 
                        as_index=False, 
                        sort=False).agg({"Algo" : ", ".join, 
                                         "Result" : "first"})
    

    输出:

       Num  Distance  Algo Result
    0  525        25  M, T   Good
    1  524        28  M, T   Good
    2  523        30     M   Good
    3  522        75     M   Good
    4  520        98     T   Good
    

    【讨论】:

      猜你喜欢
      • 2012-04-21
      • 2020-11-13
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多