使用 pandas SettingWithCopyWarning 的操作

Action with pandas SettingWithCopyWarning

我尝试 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 是另一个数据帧的一部分。您需要在尝试 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 的一部分并指向相同的数据。所以 pandas 是在警告我们。

要不看到警告,请自行复制。

df2 = df2.copy()
# or
df2 = df1[['A', 'C']].copy()