【问题标题】:Creating new column based on existing column in pandas根据熊猫中的现有列创建新列
【发布时间】:2022-08-09 15:54:59
【问题描述】:

我有一个如下给出的数据框:

ID1    ID2  Yr-Month  Class                   
1      p1   Feb-19   PE5->SC
1      p2   Feb-19   SC
1      p3   Feb-19   EA->PE5
1      p4   Feb-19   EA->PE5->SC
1      p5   Feb-19   PC->PE5->SC

我需要在现有数据中创建一个名为 Final 的新列,如果从 PE5 到 SC 的转换发生,即 PE5->SC 以下列方式 PE5->SC,EA->PE5->SC,PC->PE5->SC Final列值必须是一个 else 下面给出的 0 是预期的输出:

ID1    ID2  Yr-Month  Class         Final   
1      p1   Feb-19   PE5->SC         1
1      p2   Feb-19   SC              0
1      p3   Feb-19   EA->PE5         0
1      p4   Feb-19   EA->PE5->SC     1
1      p5   Feb-19   PC->PE5->SC     1

接下来我可以尝试什么?

    标签: python pandas dataframe


    【解决方案1】:

    通过Series.str.contains 测试子字符串并将True/False 转换为1/0 将值转换为整数:

    df['Final'] = df['Class'].str.contains('PE5.*SC').astype(int)
    

    替代numpy.where:

    df['Final'] = np.where(df['Class'].str.contains('PE5.*SC'), 1, 0)
    print (df)
       ID1 ID2 Yr-Month        Class  Final
    0    1  p1   Feb-19      PE5->SC      1
    1    1  p2   Feb-19           SC      0
    2    1  p3   Feb-19      EA->PE5      0
    3    1  p4   Feb-19  EA->PE5->SC      1
    4    1  p5   Feb-19  PC->PE5->SC      1
    

    【讨论】:

    • 如果另一行包含转换 PE5->PC->SC 这也是有效的如何修改您的代码?我忘记添加此行示例
    • @Python_help - 如果需要测试 PE5 和 SC 之间的任何值,请使用 PE5.*SC,解决方案已更改
    • @Python_help您应该使用此更新的案例真正编辑您的问题,因此其他答案也可以将他们的答案更新为您想要的,而不是您的问题声称您想要的。
    【解决方案2】:

    您可以创建一个 0s 的 'Final' 列,然后使用 .loc 使用 df['Class'].str.contains('PE5->') 查找 Class 包含 'PE5->' 的行,然后将 'Final' 中的对应值设置为 1

    df['Final'] = 0
    df.loc[df['Class'].str.contains('PE5->'), 'Final'] = 1
    

    输出:

    ID1    ID2  Yr-Month  Class         Final   
    1      p1   Feb-19   PE5->SC         1
    1      p2   Feb-19   SC              0
    1      p3   Feb-19   EA->PE5         0
    1      p4   Feb-19   EA->PE5->SC     1
    1      p5   Feb-19   PC->PE5->SC     1
    

    编辑:看到 OP 对 Jezrael 回答的评论后,原来的问题似乎缺少一个案例。涵盖更新案例的代码将是:

    df['Final'] = 0
    df.loc[df['Class'].str.contains('PE5->.*SC', regex=True), 'Final'] = 1
    

    输出:

    ID1    ID2  Yr-Month  Class         Final   
    1      p1   Feb-19   PE5->SC         1
    1      p2   Feb-19   SC              0
    1      p3   Feb-19   EA->PE5         0
    1      p4   Feb-19   EA->PE5->SC     1
    1      p5   Feb-19   PE5->PC->SC     1
    

    【讨论】:

      【解决方案3】:

      另一种有趣的方法是使用replace

      df['Final'] = df['Class'].replace(['PE5.*SC', '.'], [1, 0], regex=True)
      

      输出:

      ID1 ID2 Yr-Month Class Final
      1 p1 Feb-19 PE5->SC 1
      1 p2 Feb-19 SC 0
      1 p3 Feb-19 EA->PE5 0
      1 p4 Feb-19 EA->PE5->SC 1
      1 p5 Feb-19 PC->PE5->SC 1

      【讨论】:

        猜你喜欢
        • 2023-02-05
        • 1970-01-01
        • 1970-01-01
        • 2018-08-15
        • 2021-09-11
        • 2019-01-23
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        相关资源
        最近更新 更多