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



在Pandas中,我试图按日期过滤我的DataFrame,然后从较长的字符串中提取reporttid字符串(即破折号之间的6位数字);然而,当我运行下面的代码时,我得到了警告:

SettingWithCopyWarning:试图在来自数据帧的切片副本上设置值。尝试使用。loc[row_indexer,col_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_indexer,col_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

奇怪的是,当我运行相同的代码之外的一个函数我不再收到警告。任何人都可以为我提供一个解决方案,以避免这种警告,而代码是在功能?

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

我找到了这个问题的修复;然而,我仍然不确定为什么这个解决方案有效,而不是其他的。我只是将Pandas正则表达式提取移到了日期过滤器之前。这是有道理的,df[' reporttid ']不再是从切片的副本创建,但我仍然不知道为什么用。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)

最新更新