Python Pandas Условное добавление кадра данных только к отрицательным числам - PullRequest
2 голосов
/ 27 января 2020

Вот случайный целочисленный кадр данных, df:

df = pd.DataFrame(np.random.randint(-10,10,size=(12, 4)), columns=list('ABCD'))

Output:
     A  B  C   D
0   -6  0 -9  -9
1   -7  1 -7  -4
2  -10 -8 -7   7
3   -1 -7 -4   2
4   -1  1  7   5
5    8  7  4 -10
6    1 -1 -6  -6
7   -1  6 -1   8
8   -2  3 -4   5
9   -9 -6  6  -5
10   6  8 -1   2
11   9 -1  1  -5

Для всех отрицательных значений в столбце 'D' я хочу добавить 10 без использования l oop и без изменения других значений в датафрейм.

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 27 января 2020
df.D = df.D+np.where(df.D<0, 10, 0)

Или:

df.D = df.D.add(df.D.lt(0)*10)

    A   B   C   D
0   -10 -1  -6  3
1   -2  4   2   4
2   3   -8  0   5
3   3   2   -2  1
4   4   3   3   1
5   9   4   0   7
6   -8  -6  5   9
7   0   7   7   7
8   -9  3   -1  6
9   4   -4  0   7
10  4   -2  7   9
11  -4  -8  -1  9

Время:

Кажется, np.where - самый быстрый подход.

%%timeit 
df.D.add(df.D.lt(0)*10)
331 µs ± 3.43 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
df.D+np.where(df.D<0, 10, 0)
260 µs ± 5.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
df.loc[df['D']<0, 'D'] = df['D']+10
804 µs ± 15.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1 голос
/ 27 января 2020

Лучший способ сделать это - использовать lo c:

df.loc[df['D']<0, 'D'] = df['D']+10
...