【问题标题】:How to recognize changed value when apply transform() pandas应用 transform() pandas 时如何识别更改的值
【发布时间】:2020-12-04 01:00:27
【问题描述】:

我有一个像下面这样的 DF

df = pd.DataFrame({'category' : ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'],
                   'size': [20, 0, 10, 30, 30, 0, 0, 10],
                   'price': [5, 0, 2, 10, 10, 0, 0, 3],
                    'flag' : [0,0,0,0,0,0,0,0]
                  })

我想将 ['size'] 列中的 0 更改为类别的最大值,所以

df['size'] = np.where(df['size'].eq(0), df.groupby('category')['size'].transform('max'), df['size']) 
df['price'] = np.where(df['price'].eq(0), df.groupby('category')['price'].transform('max'), df['price']) 

输出会是这样的

df = pd.DataFrame({'category' : ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'],
                   'size': [20, 20, 10, 30, 30, 30, 10, 10],
                   'price': [5, 5, 2, 10, 10, 10, 3, 3],
                    'flag' : [0,0,0,0,0,0,0,0]
                  })

(目前已确认的过程)

但现在我想知道哪一行已更改,因此我分配了一个 ['flag'] 列,并希望在同一行中的任何其他值已更改时将值 0 更改为 1。 所以想要的输出如下所示

df = pd.DataFrame({'category' : ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'],
                   'size': [20, 20, 10, 30, 30, 30, 10, 10],
                   'price': [5, 5, 2, 10, 10, 10, 3, 3],
                    'flag' : [0,1,0,0,0,1,1,0]
                  })

无论如何我可以用转换语句做这一行吗?还是有什么好办法?

【问题讨论】:

    标签: python python-3.x pandas numpy dataframe


    【解决方案1】:

    您能否在应用操作之前标记将要更改的内容?即找到size == 0:

    的地方
    df['flag'] = (df['size'] == 0).astype(int)
    
    # then do
    df['size'] = np.where(df['size'].eq(0), df.groupby('category')['size'].transform('max'), df['size'])
    df['price'] = np.where(df['price'].eq(0), df.groupby('category')['price'].transform('max'), df['price'])
    

    或者pricesize

    df['flag'] = ((df['size'] == 0) | (df['price'] == 0)).astype(int)
    

    【讨论】:

      【解决方案2】:

      检查这里我添加了附加条件,因为该组中的整体价值价格和大小可能为 0

      cond1 = df.groupby('category')['size'].transform('max')
      cond2 = df.groupby('category')['price'].transform('max')
      
      df['changed'] = ((df['size'].ne(cond1)&df['size'].eq(0)) | (df['price'].ne(cond2)&df['price'].eq(0)))  .astype(int)
      df['size'] = np.where(df['size'].eq(0), cond1, df['size']) 
      df['price'] = np.where(df['price'].eq(0), cond2, df['price']) 
      
      Out[406]: 
        category  size  price  flag  changed
      0        A    20      5     0        0
      1        A    20      5     0        1
      2        A    10      2     0        0
      3        B    30     10     0        0
      4        B    30     10     0        0
      5        B    30     10     0        1
      6        C    10      3     0        1
      7        C    10      3     0        0
      

      或者如果最大值总是大于0

      df['changes'] = df[['size','price']].eq(0).any(1).astype(int)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-28
        • 2017-11-28
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多