python - 应用transform() pandas时如何识别变化的值

标签 python python-3.x pandas numpy dataframe

我有一个如下所示的 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]
                  })

无论如何,我可以用转换语句来完成这一行吗?或者还有什么好的办法吗?

最佳答案

您能否在应用操作之前标记要更改的内容?即找到 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'])

或者价格尺寸:

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

关于python - 应用transform() pandas时如何识别变化的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65136463/

相关文章:

python - Tensorflow Eager 和 Tensorboard 图?

Python 守护进程 - 程序结构和异常控制

python - 如何使用 pygame 播放 mp3?

Python 从字符串数组生成字典顺序输出

python - 从数据框中的其他列创建计算列

使用大表循环的python性能问题

python - 在条件下填充 df 的行

python - 在 Mac OS X 上,你使用自带的 python 还是你自己的?

python - 一般来说,在 python 代码中使用语句 "from module import *"是一个不好的做法吗?

python-3.x - 需要使用 python3 和 boto3 为特定区域创建卷的快照