Изменить знак числа в серии панд - PullRequest
0 голосов
/ 10 января 2019

Как поменять знак в серии, если у меня есть:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13

и нужно получить:

1, 2, 3, -4, -5, -6, 8, 9, 10, -11, -12, -13

Мне нужно иметь возможность установить период (теперь он равен 3) и индекс, с которого начинается функция (теперь он равен 3).

Например, если я укажу 2 в качестве индекса, я получу

1, 2, -3, -4, -5, 6, 8, 9, -10, -11, -12, 13

Мне нужно применять эту функцию последовательно к каждому столбцу, поскольку применение ко всему DataFrame приводит к ошибке памяти.

1 Ответ

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

Используйте numpy.where с целочисленным делением на (//) и по модулю (%) для логической маски:

s = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13])

N = 3
#if default RangeIndex
m = (s.index // N) % 2 == 1
#general index
#m = (np.arange(len(s.index)) // N) % 2 == 1
s = pd.Series(np.where(m, -s, s))
print (s)
0      1
1      2
2      3
3     -4
4     -5
5     -6
6      7
7      8
8      9
9    -10
10   -11
11   -12
12    13
dtype: int64

EDIT:

N = 3
M = 1
m = np.concatenate([np.repeat(False, M), 
                   (np.arange(len(s.index) - M) // N) % 2 == 0])

s = pd.Series(np.where(m, -s, s))
print (s)
0      1
1     -2
2     -3
3     -4
4      5
5      6
6      7
7     -8
8     -9
9    -10
10    11
11    12
12    13
dtype: int64
...