编辑其副本时 Pandas DataFrame 中的意外转换
Posted
技术标签:
【中文标题】编辑其副本时 Pandas DataFrame 中的意外转换【英文标题】:Unexpected transformation in pandas DataFrame while editing its copy 【发布时间】:2018-12-16 12:19:10 【问题描述】:我有带有不同类型列的 pandas DataFrame df
,df
的一些值是 NaN。
为了测试一些假设,我创建了df
的副本,并使用 pandas.isnull() 将复制的 df 转换为 (0, 1):
df_copy = df
for column in df_copy:
df_copy[column] = df_copy[column].isnull().astype(int)
但之后 df
和 df_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 SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值
Pandas DataFrame:SettingWithCopyWarning:试图在 DataFrame 的切片副本上设置一个值 [重复]
将 Pandas DataFrame 切片成新的 DataFrame