Как (с применением) выбрать и скопировать определенные столбцы в Dataframe в соответствии с индексом или другим столбцом

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

Здравствуйте, у меня есть кадр данных, как показано ниже.

              2014  2015  2016  2017  2018  2019  

         2014   10    20    30    40    0      5
         2015   0     0    200    0    100     0       
         2016   0     0    200   140    35    10       
         2017   0     0     0     20     0    12       

Мне нужно получить такой результат:

    yearStart  yearStart+1  yearStart+2  yearStart+3  yearStart+4  
0      10          20            30          40          0
1      0          200             0          100         0       
2     200         140            35          10          0
3      20          0             12           0          0

Идея состоит в том, чтобы выбрать в каждой строке столбцы между двумя датами:

index и index +delta, с параметром delta (в этом примере 4), чтобы поместить их в кадр данных.

С iterrows() это занимает слишком много времени.

я пробовал с

 df1 = df.apply(lambda x: pd.Series(x[x.keys()>=x.index],1)).fillna(0).astype(int)

но это не работает:

TypeError: ('Index(...) must be called with a collection of some kind,
1 was passed', 'occurred at index 2014')

Спасибо


person phil    schedule 19.09.2017    source источник
comment
Вы должны отредактировать свой первый вопрос, уточнив свои требования, а не открывать новый вопрос, практически идентичный первому.   -  person GPhilo    schedule 19.09.2017
comment
извините, но я новичок в этом форуме. Прошу прощения за мою неуклюжесть. В любом случае, благодарю Вас. Тот факт, что некоторые нули должны быть сохранены, дал мне основания думать, что это был другой случай.   -  person phil    schedule 19.09.2017


Ответы (1)


Одним из способов будет

In [1010]: def yearmove(x):
      ...:     idx = x.index.astype(int)
      ...:     idx = idx - x.name
      ...:     mask = idx >= 0
      ...:     idx = 'yearStart' + idx.astype(str)
      ...:     return pd.Series(x.values[mask], index=idx[mask])
      ...:

In [1011]: df.apply(yearmove, 1).fillna(0).astype(int)
Out[1011]:
      yearStart0  yearStart1  yearStart2  yearStart3  yearStart4  yearStart5
2014          10          20          30          40           0           5
2015           0         200           0         100           0           0
2016         200         140          35          10           0           0
2017          20           0          12           0           0           0
person Zero    schedule 19.09.2017
comment
Спасибо. это работает отлично. Если мне нужно иметь условие длительности временных окон, я пишу mask=(idx›=0 и idx‹=delta), но он отвечает ValueError: («Истинное значение массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()', 'произошло по индексу 2015') - person phil; 19.09.2017
comment
Я понимаю свою ошибку: «и» вместо «&», но есть ошибка типа между «int» и «int64» с оператором «&» ... Я отслеживаю это - person phil; 19.09.2017