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