【问题标题】:Creating a new column with 0 and 1 values based on regex result根据正则表达式结果创建具有 0 和 1 值的新列
【发布时间】:2023-03-10 15:18:01
【问题描述】:

我的数据框有值:

data_df

0         student
1         sample text
2         student
3         no students
4         sample texting
5         random sample

我使用正则表达式提取带有单词'student'的行,我的结果如下:

regexdf
0         student
2         student

我的目标是在主数据框中创建一个具有 0 和 1 值的新列。即第 0 行应为 1,第 5 行应为零。(因为“regexdf”在第 0 行和第 2 行中有“学生”)如何匹配两者中的索引并创建列?

【问题讨论】:

    标签: python regex pandas dataframe


    【解决方案1】:

    使用正则表达式:

    data_df = data_df.assign(regexdf = data_df[1].str.extract(r'(student)\b', expand=False))
    data_df['student'] = data_df['regexdf'].notnull().mul(1)
    print(data_df)
    

    输出:

                     1  regexdf  student
    0         student  student        1
    1     sample text      NaN        0
    2         student  student        1
    3     no students      NaN        0
    4  sample texting      NaN        0
    5   random sample      NaN        0
    

    编辑

    df_out = data_df.join(regexdf, rsuffix='regex')
    
    df_out['pattern'] = df_out['1regex'].notnull().mul(1)
    
    df_out['Count_Pattern'] = df_out['pattern'].cumsum()
    
    print(df_out)
    

    输出:

                    1   1regex  pattern  Count_Pattern
    0         student  student        1              1
    1     sample text      NaN        0              1
    2         student  student        1              2
    3     no students      NaN        0              2
    4  sample texting      NaN        0              2
    5   random sample      NaN        0              2
    

    【讨论】:

    • 我希望将正则表达式结果保留在一个单独的变量 'regexdf' 中,然后附加到主数据框作为问题中发布的 0 和 1
    • 我使用正则表达式的函数:所以在这里我不能使用 data_df = data_df.assign def regex(series, regex): series = series.str.extract(regex) series1 = series.dropna() return (series1) regexdf = regex(comp_df,(r'.*(?<!no )(student ?in|student ?out).*(hallway|library)))
    • 这可以简单地通过匹配行索引来完成吗?正则表达式索引 (0,2) 是结果。因此,附加到新数据帧的结果新列将在第 0 行和第 2 行有 1,在其他行 '0'
    • @sagar.. 我有点困惑。现在看来您只是想在索引上加入 data_df 和 regexdf。 data_df.join(regexdf, how='outer')data_df.merge(regexdf, how='outer', left_index=True, right_index=True)
    • 但是根据该行是否具有正则表达式模式,生成的新列应该有 0 和 1,这在上述连接代码中不会发生
    【解决方案2】:

    你也可以这样做

    df['bool'] = df[1].eq('student').astype(int)
    

    df['bool'] = df[1].str.match(r'(student)\b').astype(int)
    
                    1  bool
    0         student     1
    1     sample text     0
    2         student     1
    3     no students     0
    4  sample texting     0
    5   random sample     0
    

    如果你想要一个新的数据框,那么

    ndf = df[df[1].eq('student')].copy()
    

    【讨论】:

    • 我希望将正则表达式结果保留在一个单独的变量 'regexdf' 中,然后将问题中发布的 0 和 1 附加到主数据框
    猜你喜欢
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多