Python shift不适用于列和行的子集

Python shift不适用于列和行的子集,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据框: df=pd.DataFrame({“a”:[1,2,3,4,5],“b”:[3,2,1,2,2],“c”:[2,1,0,2,1]}) 我想把索引0处的a列和b列移到2。也就是说,我想要的结果是 a b c 0 NaN NaN 2 1 1 3 1 2 2 2 0 3 4 1 2 4 5 2 1 如果我这样做 df[[“a”,“b”][0:3]=df[[“a”,“b”][0:3]。班次(1) 看看df,它似乎没有

我有以下数据框:

df=pd.DataFrame({“a”:[1,2,3,4,5],“b”:[3,2,1,2,2],“c”:[2,1,0,2,1]})

我想把索引0处的a列和b列移到2。也就是说,我想要的结果是

    a   b   c
0  NaN NaN  2
1   1   3   1
2   2   2   0
3   4   1   2
4   5   2   1
如果我这样做

df[[“a”,“b”][0:3]=df[[“a”,“b”][0:3]。班次(1)

看看df,它似乎没有改变

但是,如果仅选择行或列,则可以:

单列,选择行子集:

df[“a”][0:3]=df[“a”][0:3]。班次(1)

输出:


     a  b   c
0   NaN 3   2
1   1.0 2   1
2   2.0 1   0
3   4.0 2   2
4   5.0 2   1
同样,如果我选择了一个列列表,但选择了所有行,那么它也会按预期工作:

df[[“a”,“b”]=df[[“a”,“b”]].shift(1)

输出:

    a   b   c
0   NaN NaN 2
1   1.0 3.0 1
2   2.0 2.0 0
3   3.0 1.0 2
4   4.0 2.0 1

为什么
df[[“a”,“b”][0:3]=df[[“a”,“b”][0:3]。班次(1)
没有按预期工作?我遗漏了什么吗?

问题是有双重选择-首先是列,然后是行,所以更新副本。也检查一下

可能的解决方案是选择一个索引标签和列名称:

df.loc[0:2, ["a", "b"]] = df.loc[0:2, ["a", "b"]].shift(1)
print (df)
     a    b  c
0  NaN  NaN  2
1  1.0  3.0  1
2  2.0  2.0  0
3  4.0  2.0  2
4  5.0  2.0  1
如果不是默认索引且有必要,请选择前两行:

df = pd.DataFrame({"a":[1,2,3,4,5], "b":[3,2,1,2,2], "c": [2,1,0,2,1]},
                   index=list('abcde'))

df.loc[df.index[0:2], ["a", "b"]] = df.loc[df.index[0:2], ["a", "b"]].shift(1)
print (df)
     a    b  c
a  NaN  NaN  2
b  1.0  3.0  1
c  3.0  1.0  0
d  4.0  2.0  2
e  5.0  2.0  1
df[[“a”,“b”]][0:3]
不起作用,因为您没有正确编制索引,这不是返回视图,您只是在更新副本
df = pd.DataFrame({"a":[1,2,3,4,5], "b":[3,2,1,2,2], "c": [2,1,0,2,1]},
                   index=list('abcde'))

df.loc[df.index[0:2], ["a", "b"]] = df.loc[df.index[0:2], ["a", "b"]].shift(1)
print (df)
     a    b  c
a  NaN  NaN  2
b  1.0  3.0  1
c  3.0  1.0  0
d  4.0  2.0  2
e  5.0  2.0  1