python - 在 Pandas 中,.iloc 方法是否提供副本或 View ?

标签 python pandas dataframe

我发现结果有点随机。有时它是一个副本,有时它是一个 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/

相关文章:

python - Pandas:如果相邻列中的字符串包含来自另一个 DataFrame 的子字符串,则 DataFrame 列中的平均值

python - 如何删除此 DataFrame 中不包含 A 的所有行?

python - 创建循环以从数据框中动态选择行,然后将所选行附加到另一个数据框 : df. query()

r - 如何在 R 中的整个数据帧上使用正则表达式

python - 使用 python 在 .csv 文件的行中间添加一列

python - 关于格式化 DataFrame 以与 matplotlib 一起使用的问题

python - 在 Python 的字典中创建特定值的总和

python - 从 pandas 的一系列中选择值

python - 如何替换 pandas 数据框中列开头的非整数值

dataframe - 如何在不显式命名变量的情况下生成分组汇总统计数据