我有一列带有字符串的列,我试图在其中查找标记的数量,然后在同一数据框中使用这些值创建一个新列。
data['tokens'] = data['query'].str.split().apply(len)
我得到SettingWithCopyWarning
。我不确定如何解决此问题。我了解我需要使用.loc[row_indexer,col_indexer] = value
,但不知道该如何应用。
答案 0 :(得分:1)
对DataFrame的切片进行复制时,会发生SettingWithCopyWarning
,但是熊猫认为您可能正在尝试修改基础对象。
要解决此问题,您需要了解副本和视图之间的区别。 副本会创建一个全新的对象。当您索引到DataFrame时,例如:
data['query'].str.split().apply(len)
或
data['tokens']
您正在创建一个新的DataFrame,它是原始版本的修改后的副本。如果您修改此新副本,它将不会更改原始的data
对象。您可以使用_is_view
属性进行检查,该属性将返回布尔值。
data['tokens']._is_view
另一方面,当您使用.at
,.loc
或.iloc
方法时,您将对原始DataFrame进行视图。这意味着您要根据某些条件对其进行子集设置,并操纵原始对象本身。
当您修改副本时,Pandas会引发SettingWithCopyWarning
,而您可能想修改原始副本。为避免这种情况,您可以在要复制的数据上显式使用.copy()
,也可以使用.loc
在data
(或两者)中指定要修改的列。 / p>
由于这很大程度上取决于您已经对DataFrame进行了哪些转换以及如何设置它,因此很难说出在什么地方以及如何解决它而又看不到更多代码的确切方法。不幸的是,没有一个适合所有人的答案。如果您可以发布更多代码,我们很乐意帮助您调试它。
您可以尝试做的一件事就是显式创建一个中间lengths
对象,以防出现问题。因此您的代码如下所示:
lengths = data['query'].str.split().apply(len).copy()
data['tokens'] = lengths