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