как динамически и независимо сдвигать столбцы в pandas DataFrame? - PullRequest
1 голос
/ 06 марта 2020

То, чего я хочу достичь sh, - это возможность нормализовать мои значения так, чтобы все они начинались в произвольный день-ноль. Представьте себе DataFrame ниже:

df = pd.DataFrame(np.array([[1, 0, 0], [4, 5, 0], [7, 8, 9], [7, 8, 9], [4, 5, 0], [7, 8, 9]]), 
              columns=['a', 'b', 'c'], 
              index = ['1/1/2000', '1/1/2001', '1/1/2002', '1/1/2003', '1/1/2004', '1/1/2005'])

Что приводит к следующему:

            a   b   c
1/1/2000    1   0   0
1/1/2001    4   5   0
1/1/2002    7   8   9
1/1/2003    7   8   9
1/1/2004    4   5   0
1/1/2005    7   8   9    

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

            a   b   c
1/1/2000    1   5   9
1/1/2001    4   8   9
1/1/2002    7   8   0
1/1/2003    7   5   9
1/1/2004    4   8   0
1/1/2005    7   0   0 

Я попытался использовать сдвиг, и я могу использовать что-то вроде этого:

df.b = df.b.shift(periods = -1, fill_value = 0)

, но в настоящее время я не знаю ни одного pandas удобный способ сделать это без использования циклов for и т. Д. c.

Цените, если кто-то может помочь в лучшем случае найти первое ненулевое значение, а затем правильно сместить значения в индекс ноль.

1 Ответ

2 голосов
/ 06 марта 2020

Сначала получите число сдвигов путем сравнения для не равных DataFrame.ne, затем добавьте совокупную сумму на DataFrame.cumsum, сравните 0 и последний счет True с на sum. Затем используйте DataFrame.apply с лямбда-функцией и для смен выбирайте значения Series:

s = df.ne(0).cumsum().eq(0).sum()
df = df.apply(lambda x: x.shift(periods = -s[x.name], fill_value = 0))
print (df)
          a  b  c
1/1/2000  1  5  9
1/1/2001  4  8  9
1/1/2002  7  8  0
1/1/2003  7  5  9
1/1/2004  4  8  0
1/1/2005  7  0  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...