You are starting with a DataFrame that has two columns with two different dtypes:
df.dtypes
Out:
age int64
name object
dtype: object
Since different dtypes are stored in different numpy arrays under the hood, you have two different blocks for them:
df.blocks
Out:
{'int64': age
student1 21
student2 24, 'object': name
student1 Marry
student2 John}
If you attempt to slice the first row of this DataFrame, it has to get one value from each different block which makes it necessary to create a copy.
df2.is_copy
Out[40]: <weakref at 0x7fc4487a9228; to 'DataFrame' at 0x7fc4488f9dd8>
In the second attempt, you are changing the dtypes. Since 'old' cannot be stored in an integer array, it casts the Series as an object Series.
df.loc['student3'] = ['old','Tom']
df.dtypes
Out:
age object
name object
dtype: object
Now all data for this DataFrame is stored in a single block (and in a single numpy array):
df.blocks
Out:
{'object': age name
student1 21 Marry
student2 24 John
student3 old Tom}
At this step, slicing the first row can be done on the numpy array without creating a copy, so it returns a view.
df3._is_view
Out: True
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…