我找不到与此查询类似的问题。但是,我有一个pandas数据框,我想在其中使用两个列作为条件,如果为true,则替换这些列之一中的值。
例如。我的一列是“商品名”,另一列是“值”。 “项目名称”可能会重复很多次。我要检查每个“商品名称”,如果所有其他同名商品都具有值0,则将这些“值”替换为100。
我知道这应该很简单,但是我无法理解。
为了更清楚一点,在这里
itemname value
0 a 0
1 b 100
2 c 0
3 a 0
3 b 75
3 c 90
我希望我的声明将此数据框更改为
itemname value
0 a 100
1 b 100
2 c 0
3 a 100
3 b 75
3 c 90
希望如此。我检查是否有人问过类似的问题,在这种情况下找不到任何东西。
答案 0 :(得分:3)
您可以使用GroupBy
+ transform
创建遮罩。然后通过pd.DataFrame.loc
和布尔索引进行分配:
mask = df.groupby('itemname')['value'].transform(lambda x: x.eq(0).all())
df.loc[mask.astype(bool), 'value'] = 100
print(df)
itemname value
0 a 100
1 b 100
2 c 0
3 a 100
3 b 75
3 c 90
答案 1 :(得分:3)
transform
与any
一起使用:df.loc[~df.groupby('itemname').value.transform('any'), 'value'] = 100
numpy.where
:s = ~df.groupby('itemname').value.transform('any')
df.assign(value=np.where(s, 100, df.value))
s = ~df.groupby('itemname').value.transform('any')
df.assign(value=df.value + (100 * s))
两者都能产生正确的输出,但是,np.where
和最终解决方案不会就地修改DataFrame:
itemname value
0 a 100
1 b 100
2 c 0
3 a 100
3 b 75
3 c 90
说明
~df.groupby('itemname').value.transform('any')
0 True
1 False
2 False
3 True
3 False
3 False
Name: value, dtype: bool
由于0
是一个虚假值,因此我们可以使用any
并将结果取反,以找到所有值均等于0
的组。
答案 2 :(得分:3)
如果您所有的值都是正数或0
可以对总和使用transform并检查是否为0:
m = (df.groupby('itemname').transform('sum') == 0)['value']
df.loc[m, 'value'] = 100