Условная замена в пандах для каждого ряда - PullRequest
0 голосов
/ 03 января 2019

Я, вероятно, делаю что-то очень простое, но я не могу понять хитрость там.

У меня есть фрейм данных, и я хочу заменить значения в определенном столбце, которые превышают значение из нуля, на некоторыеслучайное значениеЯ думал, что это способ достижения этого:

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

Кажется, что он дает одно и то же случайное значение для всех значений, которые превышают 0. Как я могу получить разные значения?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Используйте 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
0 голосов
/ 03 января 2019

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'])
...