编辑其副本时 Pandas DataFrame 中的意外转换

Posted

技术标签:

【中文标题】编辑其副本时 Pandas DataFrame 中的意外转换【英文标题】:Unexpected transformation in pandas DataFrame while editing its copy 【发布时间】:2018-12-16 12:19:10 【问题描述】:

我有带有不同类型列的 pandas DataFrame dfdf 的一些值是 NaN。

为了测试一些假设,我创建了df 的副本,并使用 pandas.isnull() 将复制的 df 转换为 (0, 1):

df_copy = df
for column in df_copy:
    df_copy[column] = df_copy[column].isnull().astype(int)

但之后 dfdf_copy 都由 0 和 1 组成。 为什么这段代码会将df 转换为 0、1,有没有办法阻止它?

【问题讨论】:

df_copy = df 永远不要在 Python 中创建副本。 一般来说,理解这一点非常重要,因此您真的应该阅读:nedbatchelder.com/text/names.html 【参考方案1】:

你可以阻止它声明:

df_copy = df.copy()

这会创建一个新对象。在此之前,您基本上有两个指向同一个对象的指针。您可能还想查看answer 并注意 DataFrame 是可变的。

顺便说一句,您可以通过以下方式获得所需的结果:

df_copy = df.isnull().astype(int)

【讨论】:

【参考方案2】:

更好的记忆力

for column in df:
    df[column + 'flag'] = df[column].isnull().astype(int)

【讨论】:

以上是关于编辑其副本时 Pandas DataFrame 中的意外转换的主要内容,如果未能解决你的问题,请参考以下文章

识别另一个 pandas DataFrame 的视图或副本

Pandas SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值

Pandas DataFrame:SettingWithCopyWarning:试图在 DataFrame 的切片副本上设置一个值 [重复]

将 Pandas DataFrame 切片成新的 DataFrame

在 Pandas DataFrame 子集(副本)上设置值很慢

将行附加到 pandas DataFrame 而不制作新副本