熊猫 SettingWithCopyWarning 的操作
Posted
技术标签:
【中文标题】熊猫 SettingWithCopyWarning 的操作【英文标题】:Action with pandas SettingWithCopyWarning 【发布时间】:2016-11-03 23:04:06 【问题描述】:我尝试delete
某个列并用
df2.drop(df2.columns[[0, 1, 3]], axis=1, inplace=True)
df2['date'] = df2['date'].map(lambda x: str(x)[1:])
df2['date'] = df2['date'].str.replace(':', ' ', 1)
df2['date'] = pd.to_datetime(df2['date'])
我得到所有这些字符串
df2.drop(df2.columns[[0, 1, 3]], axis=1, inplace=True)
C:/Users/����� �����������/Desktop/projects/youtube_log/filter.py:11: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
有什么问题?
【问题讨论】:
你是如何创建df2
的?如果您输入了类似df2 = df1
的内容,则此错误来自以下事实:df2
是df1
的一部分,而不是整个对象本身。试试df2 = df1.copy()
@ysearka df2 = df[df.id == 30013]
【参考方案1】:
您的df2
是另一个数据帧的一部分。您需要在尝试 drop
之前使用 df2 = df2.copy()
显式复制它
考虑以下数据框:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.arange(20).reshape(4, 5), list('abcd'), list('ABCDE'))
df1
让我将df1
的一部分分配给df2
df2 = df1[['A', 'C']]
df2
现在是df1
的一部分,如果我们尝试更改df2
中的内容,应该会触发那些讨厌的SettingWithCopyWarning
。一起来看看吧。
df2.drop('c')
没问题。怎么样:
df2.drop('c', inplace=True)
就是这样:
问题在于 Pandas 试图提高效率并跟踪 df2
指向与 df1
相同的数据。它正在维护这种关系。该警告告诉您,您不应该尝试通过切片来弄乱原始数据帧。
请注意,当我们查看 df2
时,“c”行已被删除。
df2
查看df1
,我们看到“c”行仍然存在。
df1
pandas 复制了df2
,然后删除了“c”行。这可能与我们的意图可能不一致,因为我们将df2
制作为df1
的一部分并指向与df1
相同的数据。所以熊猫是在警告我们。
要看不到警告,请自己制作副本。
df2 = df2.copy()
# or
df2 = df1[['A', 'C']].copy()
【讨论】:
感谢您的精彩解释! 如果不想复制但仍然删除消息,您可以设置它:pd.options.mode.chained_assignment = None 我可以对 pandas 说不在该语句中显示消息吗?我的意图确实是从切片中删除一行,而不是原始数据以上是关于熊猫 SettingWithCopyWarning 的操作的主要内容,如果未能解决你的问题,请参考以下文章
熊猫:SettingWithCopyWarning 触发位置
为啥我从熊猫那里得到 SettingWithCopyWarning
尝试 .loc 后的熊猫 SettingWithCopyWarning