【问题标题】:Convert first value from 0 to 1 based on group and mask columns in a Pandas Dataframe根据 Pandas Dataframe 中的组和掩码列将第一个值从 0 转换为 1
【发布时间】:2023-01-12 23:04:19
【问题描述】:

我正在尝试将 Pandas Dataframe 的列中第一次出现的 0 转换为 1。有问题的列包含 1、0 和空值。样本数据如下:

mask_col categorical_col target_col
TRUE A 1
TRUE A 1
FALSE A
TRUE A 0
FALSE A
TRUE A 0
TRUE B 1
FALSE B
FALSE B
FALSE B
TRUE B 0
FALSE B

我希望第 4 行和第 11 行更改为 1,并将第 6 行保留为 0。

我该怎么做呢?

【问题讨论】:

  • 究竟是什么逻辑呢? True到第二个都是1,其他都是0?
  • 我正在使用分类作为 groupby 列进行成像,然后结合掩码的真值仅将每个组中第一次出现的 0 更改为 1

标签: python pandas


【解决方案1】:

逻辑并不完全清楚,但考虑到每组 categorical_colTrue 的延伸,并假设您想要第一个 N 延伸(此处 N=2)作为 1

vals = (df.groupby('categorical_col', group_keys=False)['mask_col']
          .apply(lambda s: s.ne(s.shift())[s].cumsum())
       )

df.loc[vals[vals.le(2)].index, 'target_col'] = 1

输出:

    mask_col categorical_col  target_col
0       True               A         1.0
1       True               A         1.0
2      False               A         NaN
3       True               A         1.0
4      False               A         NaN
5       True               A         0.0
6       True               B         1.0
7      False               B         NaN
8      False               B         NaN
9      False               B         NaN
10      True               B         1.0
11     False               B         NaN

【讨论】:

    【解决方案2】:

    利用:

    m = df['target_col'].eq(0)
    df.loc[ m.groupby(df['categorical_col']).idxmax(), 'target_col'] = 1
    print (df)
        mask_col categorical_col  target_col
    0       True               A         1.0
    1       True               A         1.0
    2      False               A         NaN
    3       True               A         1.0
    4      False               A         NaN
    5       True               A         0.0
    6       True               B         1.0
    7      False               B         NaN
    8      False               B         NaN
    9      False               B         NaN
    10      True               B         1.0
    11     False               B         NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-08
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 2021-11-10
      • 1970-01-01
      • 2019-02-15
      相关资源
      最近更新 更多