Сдвигать все значения данных без изменения столбцов - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть pandas DataFrame ниже:

pd.DataFrame(
    list(range(16,0,-1)),
    index=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P']
)

Я хотел бы знать, есть ли pandas function, который может позволить мне сместиться на число x значений этого кадра данных вспособ, который: экземпляр, если x=3, я получаю:

 D    E    F    G    H  I    J    K   L   M   N  O   P 
16   15   14   13   12  11   10   9   8   7   6  5   4

и удостоверяется, что последние столбцы сохраняют тот же порядок

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Хотя ответ @ Chris интуитивно понятен и, вероятно, то, что вы должны использовать, я добавлю свои 2 цента.

dropna с astype

Мне не нравится преобразование целых чисел в числа с плавающей точкой при сдвиге.Также обратите внимание, что я использую df.dtypes в astype.Это сохраняет независимость от того, с каких типов начинаются.

df.shift(3).dropna().astype(df.dtypes).T

    D   E   F   G   H   I   J  K  L  M  N  O  P
0  16  15  14  13  12  11  10  9  8  7  6  5  4

Это проблематично, если в данных уже есть NA.В этом случае я бы включил iloc, чтобы явно обрезать первые 3 строки.Но если это так, тогда просто используйте следующее решение


iloc с set_index

df.iloc[3:].set_index(df.index[:-3]).T

    D   E   F   G   H   I   J  K  L  M  N  O  P
0  16  15  14  13  12  11  10  9  8  7  6  5  4

pd.DataFrame

pd.DataFrame(df.values[:-3].T, df.columns, df.index[3:])

    D   E   F   G   H   I   J  K  L  M  N  O  P
0  16  15  14  13  12  11  10  9  8  7  6  5  4
0 голосов
/ 13 февраля 2019

Как уже упоминалось @chris, transpose и shift () должны работать.

Вы выбираете DataFrame:

>>> df
    0
A  16
B  15
C  14
D  13
E  12
F  11
G  10
H   9
I   8
J   7
K   6
L   5
M   4
N   3
O   2
P   1

Вывод:

>>> df.T.shift(3, axis=1)
    A   B   C     D     E     F     G     H     I     J    K    L    M    N    O    P
0 NaN NaN NaN  16.0  15.0  14.0  13.0  12.0  11.0  10.0  9.0  8.0  7.0  6.0  5.0  4.0

Редактировать:

На всякий случай, если вы не хотите, чтобы столбцы Nan и плавающие числа были заменены на Int.

>>> df.T.shift(3, axis=1).dropna(axis=1, how='all').astype(int)
 # df.T.shift(3, axis=1).dropna(axis=1).astype(int)
    D   E   F   G   H   I   J  K  L  M  N  O  P
0  16  15  14  13  12  11  10  9  8  7  6  5  4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...