【问题标题】:based on dataframe column result all following rows equal a repetitive value until result changes and new repetitive value occurs基于数据框列结果,所有后续行都等于重复值,直到结果更改并出现新的重复值
【发布时间】:2019-11-08 08:44:44
【问题描述】:

我的简化数据框如下:

df = pd.DataFrame()
df['A'] = ('IGNORE','IGNORE','IGNORE','YES','IGNORE','YES','YES','YES','IGNORE','IGNORE','IGNORE','YES','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE', 'NO','IGNORE','IGNORE','IGNORE','IGNORE')

我需要反转数据帧(我知道我可以通过 df = df[::-1] 完成)然后按如下方式制作 B 列。

  • 如果出现“YES”,则后面的行会导致“GOOD”,直到再次出现“YES”或“NO”,反之亦然,如果出现“NO”,“BAD”除外将替换“GOOD”

愿望输出如下:

df['B'] = ('GOOD','GOOD','GOOD','YES','IGNORE','YES','YES','YES','GOOD','GOOD','GOOD','YES','BAD','BAD','BAD','BAD','BAD','BAD','BAD','BAD','BAD', 'NO','IGNORE','IGNORE','IGNORE','IGNORE')

【问题讨论】:

    标签: pandas numpy dataframe for-loop


    【解决方案1】:

    想法是首先使用Series.map dy 字典并回填缺失值并将最后一组替换为fillnaSeries,用于替换IGNORE 连续值 - 2 个或更多:

    s = df['A'].map({'IGNORE': np.nan, 'YES':'GOOD', 'NO':'BAD'}).bfill().fillna(df['A'])
    m1 = df.groupby(df['A'].ne(df['A'].shift()).cumsum())['A'].transform('size').ne(1)
    m2 = df['A'].eq('IGNORE')
    
    df['C'] = np.where(m1 & m2, s, df['A'])
    print(df)
             A       B       C
    0   IGNORE    GOOD    GOOD
    1   IGNORE    GOOD    GOOD
    2   IGNORE    GOOD    GOOD
    3      YES     YES     YES
    4   IGNORE  IGNORE  IGNORE
    5      YES     YES     YES
    6      YES     YES     YES
    7      YES     YES     YES
    8   IGNORE    GOOD    GOOD
    9   IGNORE    GOOD    GOOD
    10  IGNORE    GOOD    GOOD
    11     YES     YES     YES
    12  IGNORE     BAD     BAD
    13  IGNORE     BAD     BAD
    14  IGNORE     BAD     BAD
    15  IGNORE     BAD     BAD
    16  IGNORE     BAD     BAD
    17  IGNORE     BAD     BAD
    18  IGNORE     BAD     BAD
    19  IGNORE     BAD     BAD
    20  IGNORE     BAD     BAD
    21      NO      NO      NO
    22  IGNORE  IGNORE  IGNORE
    23  IGNORE  IGNORE  IGNORE
    24  IGNORE  IGNORE  IGNORE
    25  IGNORE  IGNORE  IGNORE
    

    【讨论】:

      猜你喜欢
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 2021-04-28
      • 2018-05-08
      相关资源
      最近更新 更多