我发现结果有点随机。有时它是一个副本,有时它是一个 View 。例如:
df = pd.DataFrame([{'name':'Marry', 'age':21},{'name':'John','age':24}],index=['student1','student2'])
df
age name
student1 21 Marry
student2 24 John
现在,让我试着稍微修改一下。
df2= df.loc['student1']
df2 [0] = 23
df
age name
student1 21 Marry
student2 24 John
如您所见,没有任何变化。 df2 是一个副本。但是,如果我将另一个学生添加到数据框中......
df.loc['student3'] = ['old','Tom']
df
age name
student1 21 Marry
student2 24 John
student3 old Tom
再次尝试更改年龄..
df3=df.loc['student1']
df3[0]=33
df
age name
student1 33 Marry
student2 24 John
student3 old Tom
现在df3一下子变成了view。到底是怎么回事?我想“旧”值是关键?
最佳答案
您从一个 DataFrame 开始,该 DataFrame 有两列和两种不同的数据类型:
df.dtypes
Out:
age int64
name object
dtype: object
由于不同的数据类型在底层存储在不同的 numpy 数组中,因此它们有两个不同的 block :
df.blocks
Out:
{'int64': age
student1 21
student2 24, 'object': name
student1 Marry
student2 John}
如果您尝试切片此 DataFrame 的第一行,它必须从每个不同的 block 中获取一个值,这使得有必要创建一个副本。
df2.is_copy
Out[40]: <weakref at 0x7fc4487a9228; to 'DataFrame' at 0x7fc4488f9dd8>
在第二次尝试中,您正在更改数据类型。由于 'old' 不能存储在整数数组中,因此它将 Series 转换为对象 Series。
df.loc['student3'] = ['old','Tom']
df.dtypes
Out:
age object
name object
dtype: object
现在这个 DataFrame 的所有数据都存储在一个 block 中(和一个 numpy 数组中):
df.blocks
Out:
{'object': age name
student1 21 Marry
student2 24 John
student3 old Tom}
在这一步,可以在 numpy 数组上对第一行进行切片而不创建副本,因此它返回一个 View 。
df3._is_view
Out: True
关于python - 在 Pandas 中,.iloc 方法是否提供副本或 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47972633/