使用 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()
我尝试 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()