移位数据框的每个值而无需更改列

时间:2019-02-13 15:03:35

标签: python pandas numpy

我下面有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 :(得分:3)

尽管@Chris的回答很直观,而且可能是您应该使用的答案,但我还是要加2美分。

dropnaastype

我不喜欢移位时将整数转换为浮点数。另请注意,我在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来显式修剪前三行。但是如果是这样,那就使用下一个解决方案


ilocset_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

答案 1 :(得分:2)

如@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