gpt4 book ai didi

python - dataframe iloc 在 pandas 中出乎意料地工作

转载 作者:太空狗 更新时间:2023-10-30 02:51:24 25 4
gpt4 key购买 nike

我正在创建这样的数据框。

np.random.seed(2)
df=pd.DataFrame(np.random.randint(1,6,(6,6)))

out[]

0 1 1 4 3 4 1
1 3 2 4 3 5 5
2 5 4 5 3 4 4
3 3 2 3 5 4 1
4 5 4 2 3 1 5
5 5 3 5 3 2 1

将数据帧拆分为如下所示的 3,3 矩阵,它将具有 16 矩阵。 dfs=[]

for col in range(df.shape[1]-2):
for row in range(df.shape[0]-2):
dfs.append(df.iloc[row:row+3,col:col+3])

让我们打印,

dfs[0]
1 1 4
3 2 4
5 4 5

dfs[1]
3 2 4
5 4 5
3 2 3
.
.
.
dfs[15]

5 4 1
3 1 5
3 2 1

编写一个函数,将位置 [1,0] 和 [1,2] 中每个矩阵的值更改为零,这样我的输出看起来像,

dfs[0]
1 1 4
0 2 0
5 4 5


def process(x):
new=[]
for d in x:
d.iloc[1,0]=0
d.iloc[1,2]=0
new.append(d)
print(d)
return new

dfs=process(dfs.copy())

我的预期输出是

dfs[0]
1 1 4
0 2 0
5 4 5

但是我的函数返回的是,

dfs[0]
1 1 4
0 0 0
0 0 0

dfs[1]
0 0 0
0 0 0
0 0 0

它在所有矩阵中产生更多的零。我不知道为什么它会意外工作或者我的函数 process 做错了什么请帮忙。谢谢。

最佳答案

长话短说,您是 chained indexing 的受害者, 这可以 lead to bad things happening .

当您切片原始 DataFrame 时,您会得到重叠的 View 。

修改一个也会改变其他,因为一个 block 的第二行是另一个 block 的第一行,第一个 block 的第三行是另一个 block 的第一行,依此类推...这就是为什么你仅在“边缘”处看到非零值,因为它们对于单个 block 是唯一的。

您可以像这样复制每个切片:

def process(x):
new = []
for d in x:
d = d.copy() # each one is now a copy
d.iloc[1, 0]=0
d.iloc[1, 2]=0
new.append(d)
return new

最后,请注意 dfs = process(dfs) 实际上没问题;您不需要复制封闭的 list

关于python - dataframe iloc 在 pandas 中出乎意料地工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56071241/

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