gpt4 book ai didi

python - pandas shift 不适用于列和行的子集

转载 作者:行者123 更新时间:2023-12-04 10:17:28 26 4
gpt4 key购买 nike

我有以下数据框:
df = pd.DataFrame({"a":[1,2,3,4,5], "b":[3,2,1,2,2], "c": [2,1,0,2,1]})

    a   b   c
0 1 3 2
1 2 2 1
2 3 1 0
3 4 2 2
4 5 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].shift(1)
并查看 df ,好像没变。

但是,如果只选择行或列,则它有效:

单列,选择行的子集:
df["a"][0:3] = df["a"][0:3].shift(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].shift(1)没有按预期工作?我错过了什么吗?

最佳答案

问题是有双重选择 - 首先是列,然后是行,所以更新副本。另请检查 evaluation order matters .

一种选择的可能解决方案 DataFrame.loc 对于索引标签和列名:

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

如果不是默认索引并且有必要选择前 2 行:
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

关于python - pandas shift 不适用于列和行的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61009387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com