python - Pandas 使用什么规则来生成 View 和副本?

标签 python pandas dataframe indexing chained-assignment

我对 Pandas 在确定从数据框中选择的内容是原始数据框的副本还是原始数据框的 View 时使用的规则感到困惑。

如果我有,例如,

df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))

我知道 query 会返回一个副本,这样类似

foo = df.query('2 < index <= 5')
foo.loc[:,'E'] = 40

对原始数据帧 df 没有影响。我也明白标量或命名切片返回一个 View ,以便对这些进行分配,例如

df.iloc[3] = 70

df.ix[1,'B':'E'] = 222

将改变 df。但是当涉及到更复杂的情况时,我会迷路。例如,

df[df.C <= df.B] = 7654321

改变了df,但是

df[df.C <= df.B].ix[:,'B':'E']

没有。

Pandas 是否有一个我只是缺少的简单规则?在这些特定情况下发生了什么;特别是,如何更改满足特定查询的数据框中的所有值(或值的子集)(正如我在上面的最后一个示例中尝试做的那样)?


注意:这与 this question 不同。 ;我已经阅读了the documentation ,但我没有被它启发。我还通读了关于这个主题的“相关”问题,但我仍然错过了 Pandas 使用的简单规则,以及我将如何应用它——例如——修改值(或值的子集)在满足特定查询的数据框中。

最佳答案

这是规则,后续覆盖:

  • 所有操作都会生成一个副本

  • 如果提供了inplace=True,它将就地修改;只有部分操作支持这个

  • 设置的索引器,例如.loc/.iloc/.iat/.at 将就地设置。

  • 获取单一类型对象的索引器几乎总是一个 View (取决于内存布局,它可能不是这就是不可靠的原因)。这主要是为了效率。 (上面的示例是针对 .query 的;这将 always 返回一个副本,因为它由 numexpr 评估)

  • 获取多类型对象的索引器始终是副本。

链式索引

的示例
df[df.C <= df.B].loc[:,'B':'E']

不能保证有效(因此您应该永远不要这样做)。

改为:

df.loc[df.C <= df.B, 'B':'E']

因为这是 更快 并且将始终有效

链式索引是 2 个独立的 python 操作,因此不能被 pandas 可靠地拦截(您经常会得到 SettingWithCopyWarning,但这也不是 100% 可检测到的)。 dev docs ,您指出,提供了更全面的解释。

关于python - Pandas 使用什么规则来生成 View 和副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23296282/

相关文章:

python - 如何在一行中转换shell脚本并从Python子进程中执行它?

Python Pandas SUMPRODUCT 和 L 矩阵计算

python - 如何在 DataFrame 的每一行上添加两列的 value_counts?

apache-spark - Spark : Difference between numPartitions in read. jdbc(..numPartitions..) 和 repartition(..numPartitions..)

python - pandas dataframe 列之间的计算

python - 仅当在单独的文件中给出转换命令时,将 HTML 转换为 PDF 才有效

python - 如何为不同的类运行相同的测试用例?

python - 使用两个条件过滤数据框 pandas python

Python Pandas cumsum 移位 n

python - 从 pandas DataFrame 中的日期时间列中提取月份