【问题标题】:Conditional replacement in pandas for each row熊猫每行的条件替换
【发布时间】:2019-05-29 20:45:26
【问题描述】:

我可能正在做一些非常简单的事情,但我无法弄清楚那里的窍门。

我有一个数据框,我想用某个随机值替换特定列中超过从零开始的值的值。我曾认为这是实现这一目标的一种方式:

self.dfile['foo'] = np.where(self.dfile['foo'] >= 0, random.uniform(4, 9), self.dfile['foo'])

似乎在所有超过 0 的值中给出相同的随机值。如何获得不同的值?

【问题讨论】:

    标签: python pandas numpy series


    【解决方案1】:

    使用numpy.random.uniform,指定长度为DataFrame

    v = np.random.uniform(4, 9, size=len(self.dfile))
    self.dfile['foo'] = np.where(self.dfile['foo'] >= 0, v,self.dfile['foo'])
    

    示例

    np.random.seed(123)
    
    dfile = pd.DataFrame({
             'foo':[0,5.1,1,0,20.4,10.7],
    })
    
    v = np.random.uniform(4, 9, size=len(dfile))
    
    dfile['foo1'] = np.where(dfile['foo'] >= 0, v, dfile['foo'])
    dfile['foo2'] = np.where(dfile['foo'].between(0, 10), v ,dfile['foo'])
    print (dfile)
    
        foo      foo1       foo2
    0   0.0  7.482346   7.482346
    1   5.1  5.430697   5.430697
    2   1.0  5.134257   5.134257
    3   0.0  6.756574   6.756574
    4  20.4  7.597345  20.400000
    5  10.7  6.115532  10.700000
    

    【讨论】:

    • 谢谢。这也会起作用吗? self.dfile['foo'] = np.where(self.dfile['foo'] >= 0 and self.dfile['foo'] <= 10, v, self.dfile['foo'])
    • @tandem - 你很接近,需要& 进行按位与,还需要()self.dfile['foo'] = np.where((self.dfile['foo'] >= 0) & (self.dfile['foo'] <= 10), v, self.dfile['foo'])
    • @tandem - 或者更好的self.dfile['foo'] = np.where(self.dfile['foo'].between(0, 10), v,self.dfile['foo'])
    【解决方案2】:

    random.uniform(4, 9) 返回一个整数,np.where 然后在所有行中广播。相反,使用np.random,它给出了一个指定长度的数组:

    self.dfile['foo'] = np.where(self.dfile['foo'] >= 0,
                                 np.random.uniform(4, 9, len(self.dfile.index)),
                                 self.dfile['foo'])
    

    【讨论】:

      猜你喜欢
      • 2013-04-15
      • 2020-04-19
      • 2017-12-28
      • 2017-11-30
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2022-12-11
      相关资源
      最近更新 更多