【问题标题】:Action with pandas SettingWithCopyWarning熊猫 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 的内容,则此错误来自以下事实:df2df1 的一部分,而不是整个对象本身。试试df2 = df1.copy()
  • @ysearka df2 = df[df.id == 30013]

标签: python pandas dataframe chained-assignment


【解决方案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 说不在该语句中显示消息吗?我的意图确实是从切片中删除一行,而不是原始数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 2017-12-23
  • 2019-11-06
  • 2015-02-23
  • 1970-01-01
相关资源
最近更新 更多