在条件条件下设置熊猫数据框的值

时间:2018-09-28 17:11:09

标签: python pandas pandas-groupby

我找不到与此查询类似的问题。但是,我有一个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

希望如此。我检查是否有人问过类似的问题,在这种情况下找不到任何东西。

3 个答案:

答案 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)

transformany一起使用:

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