使用pandas进行操作SettingWithCopyWarning

lde*_*ina 5 python dataframe pandas chained-assignment

我尝试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'])
Run Code Online (Sandbox Code Playgroud)

我得到的所有这些字符串

  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
Run Code Online (Sandbox Code Playgroud)

那有什么问题?

piR*_*red 11

df2是另一个数据帧的片段.您需要df2 = df2.copy()在尝试之前明确复制它drop

考虑以下数据帧:

import pandas as pd
import numpy as np


df1 = pd.DataFrame(np.arange(20).reshape(4, 5), list('abcd'), list('ABCDE'))

df1
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

让我指定的切片df1df2

df2 = df1[['A', 'C']]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

df2如果我们试图改变一些事情的话,现在已经成为了一部分df1并且应该触发那些讨厌的SettingWithCopyWarningdf2.让我们来看看.

df2.drop('c')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

没问题.怎么样:

df2.drop('c', inplace=True)
Run Code Online (Sandbox Code Playgroud)

它是:

在此输入图像描述

问题是pandas试图提高效率并且跟踪df2指向相同数据的轨道df1.它保留了这种关系.警告告诉您,您不应该尝试通过切片混淆原始数据帧.

请注意,当我们查看时df2,行'c'已被删除.

df2
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

看着df1我们看到行'c'仍在那里.

df1
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

熊猫制作了一份df2然后丢弃的'c'行.这可能与我们的意图可能不一致,我们的意图是考虑到我们做df2了一些并指向相同的数据df1.所以大熊猫警告我们.

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

df2 = df2.copy()
# or
df2 = df1[['A', 'C']].copy()
Run Code Online (Sandbox Code Playgroud)

  • 如果不想复制但仍删除消息,则可以对其进行设置:pd.options.mode.chained_assignment = None (2认同)