我下面有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
并确保最后一列保持相同的顺序
答案 0 :(得分:3)
尽管@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
来显式修剪前三行。但是如果是这样,那就使用下一个解决方案
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
答案 1 :(得分:2)
如@chris所述,transpose和shift()应该可以工作。
>>> 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