【问题标题】:How to assign a new column to a dataframe based on comparison between other columns?如何根据其他列之间的比较将新列分配给数据框?
【发布时间】:2022-11-06 23:12:17
【问题描述】:

在我通过 SQL 创建的一张 Excel 文件中,我有 3 列代表字母等级。评级值在评级 1、2 和 3 之间可能不同,但它们仍然可以使用相同的值进行排名。

我正在尝试在我的 Excel 文件中创建一个新列,该列可以采用这 3 个字母评级并拉出中间评级。

 ranking       | Rating_1 | Rating_2 | Rating_3 | NEW_COLUMN    |
   (1 lowest)  | -------- | -------- | -------- | --------      |
        3      |    A+    |   AA     |    Aa    | middle(rating)|
        2      |    B+    |   BB     |    Bb    | middle(rating)|
        1      |    Fa    |   Fb     |    Fc    | middle(rating)|
               | -------- | -------- | -------- | ---------     |

我需要考虑三种情况:

  1. 如果所有三个评级都不同,请在评级_1、评级_2 和评级_3 之间选择不是最高评级或最低评级的评级
  2. 如果所有三个等级都相同,请在 rating_1 上选择等级
  3. 如果有 2 个评级相同,但有一个不同,则选择最低评级

    我创建了一个数据框:

    df = pd.DataFrame(
        {"Rating_1": ["A+", "AA", "Aa"],
         "Rating_2": ["B+", "BB", "Bb"],
         "Rating_3": ["Fa", "Fb", "Fc"]}
    )
    df["NEW COLUMN"] = {insert logic here} 
    

    还是更容易创建一个过滤掉原始 DF 的新 DF?

【问题讨论】:

    标签: python pandas dataframe conditional-statements


    【解决方案1】:

    使用以下数据框:

    import pandas as pd
    
    df = pd.DataFrame(
        {
            "Rating_1": ["A+", "Cc", "Aa"],
            "Rating_2": ["AA", "Cc", "Aa"],
            "Rating_3": ["BB", "Cc", "Bb"],
        }
    )
    
    print(df)
    # Output
      Rating_1 Rating_2 Rating_3
    0       A+       AA       BB
    1       Cc       Cc       Cc
    2       Aa       Aa       Bb
    

    这是使用 Python sets 检查条件的一种方法:

    # First condition
    df["Middle_rating"] = df.apply(
        lambda x: sorted([x["Rating_1"], x["Rating_2"], x["Rating_3"]])[1]
        if len(set([x["Rating_1"], x["Rating_2"], x["Rating_3"]])) == 3
        else "",
        axis=1,
    )
    
    # Second condition
    df["Middle_rating"] = df.apply(
        lambda x: x["Rating_1"]
        if len(set([x["Rating_1"], x["Rating_2"], x["Rating_3"]])) == 1
        else x["Middle_rating"],
        axis=1,
    )
    
    # Third condition
    ratings = {
        rating: i
        for i, rating in enumerate(["A+", "AA", "Aa", "B+", "BB", "Bb", "C+", "CC", "Cc"])
    }  # ratings ordered from best (A+: 0) to worst (CC: 8)
    df["Middle_rating"] = df.apply(
        lambda x: max(x["Rating_1"], x["Rating_2"], x["Rating_3"])
        if len(
            set([ratings[x["Rating_1"]], ratings[x["Rating_2"]], ratings[x["Rating_3"]]])
        )
        == 2
        else x["Middle_rating"],
        axis=1,
    )
    

    然后:

    print(df)
    # Output
      Rating_1 Rating_2 Rating_3 Middle_rating
    0       A+       AA       BB            AA
    1       Cc       Cc       Cc            Cc
    2       Aa       Aa       Bb            Bb
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 2015-11-21
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 2017-01-03
      相关资源
      最近更新 更多