SettingWithCopyWarning在函数中使用extract()时发生

2024-05-20 00:04:44 发布

您现在位置:Python中文网/ 问答频道 /正文

在Pandas中,我尝试按日期过滤数据帧,然后从较长的字符串中提取reportId字符串(即破折号之间的6位数字);但是,当我运行以下代码时,我得到警告:

使用CopyWarning设置: 试图在数据帧切片的副本上设置值。 尝试改用.loc[row\u indexer,col\u indexer]=value

list_date = [1632309961, 1632310980, 1632311134, 1632411137, 
            1632411139, 1632411142, 1632411144, 1632411146, 
            1632413166, 1632413427]
list_id =   ['se-84c735-hg5675', 'se-5f73s9-hg3465', 'se-1f34g6-hg3455', 'se-09f67s-hg5123', 
            'se-5g63g9-hg1235', 'se-47h8h0-hg5555', 'se-h901h3-hg6755', 'se-287n54-hg5321', 
            'se-g357a8-hg6675', 'se-56q89r-hg5767']

df = pd.DataFrame([list_date, list_id], index=['date_unix','id']).T

def test_extract(df):
    df['date'] = pd.to_datetime(df['date_unix'], unit='s')
    df = df[df['date'] >= pd.to_datetime('2021-09-23')]
    df['reportId'] = df['id'].str.extract(r"([a-zA-Z0-9]{6})")
    return df

test_extract(df)

我已经尝试了一些不同的修复方法,比如使用.loc[row\u indexer,col\u indexer]或抛出.copy()作为日期过滤器;然而,我也遇到了同样的问题:

def test_extract(df):
    df['date'] = pd.to_datetime(df['date_unix'], unit='s')
    df = df.loc[df['date'] >= pd.to_datetime('2021-09-23'),:]
    df['reportId'] = df['id'].str.extract(r"([a-zA-Z0-9]{6})")
    return df

奇怪的是,当我在函数外运行相同的代码时,我不再收到警告。有人能为我提供一个解决方案,在代码运行时避免此警告吗

信息: 熊猫-0.23.4::Python 3.7.10:: 操作系统-Linux(Ubuntu 16.04.7 LTS)


1条回答
网友
1楼 · 发布于 2024-05-20 00:04:44

我找到了解决这个问题的方法;但是,我仍然不确定为什么这个解决方案有效,而其他解决方案无效。我只是将Pandas正则表达式提取移到日期过滤器之前。df['reportId']不再是从切片的副本创建的,这是有道理的,但是我仍然不知道为什么用.loc格式化日期过滤器不能解决这个问题。如果有人有见解,我欢迎你的评论

def test_extract(df):
    df['reportId'] = df['id'].str.extract(r"([a-zA-Z0-9]{6})")
    df['date'] = pd.to_datetime(df['date_unix'], unit='s')
    df = df[df['date'] >= pd.to_datetime('2021-09-23')]
    return df

test_extract(df)

相关问题 更多 >